/ Hex Artifact Content
Login

Artifact bef8ceec858b167bd0ce0863fe0bdd527126c213:


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 34 20 32 30 30 37 2f 31  c,v 1.434 2007/1
0190: 32 2f 32 31 20 30 34 3a 34 37 3a 32 36 20 64 61  2/21 04:47:26 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 73 7a  Next;.    int sz
2c3a0 4e 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  Next;  /* The co
2c3b0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69  mpiler warning i
2c3c0 73 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20  s wrong: szNext 
2c3d0 69 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20  is always .     
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2c3f0 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
2c400 65 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61  e use.  Adding a
2c410 6e 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  n extra initiali
2c420 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  zation.         
2c430 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69          ** to si
2c440 6c 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c  lence the compil
2c450 65 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68  er slows down th
2c460 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  e code. */.    i
2c470 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
2c480 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
2c490 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
2c4a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
2c4b0 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20  >leafData );.   
2c4c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2c4d0 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2c4e0 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2c4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c500 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2c510 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2c520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c530 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2c540 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c550 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2c560 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2c570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
2c590 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2c5a0 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2c5b0 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2c5c0 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2c5d0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2c5e0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2c5f0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c  , pPage->pgno, l
2c600 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67  eafCur.pPage->pg
2c610 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2c620 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c630 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c640 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c650 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
2c660 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75   findCell(leafCu
2c670 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c680 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e  .idx);.      szN
2c690 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2c6a0 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  r(leafCur.pPage,
2c6b0 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2c6c0 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2c6d0 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2c6e0 2b 34 20 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  +4 );.      temp
2c6f0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cell = sqlite3_m
2c700 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53  alloc( MX_CELL_S
2c710 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  IZE(pBt) );.    
2c720 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
2c730 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2c740 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c780 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2c790 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70  ge, pCur->idx, p
2c7a0 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
2c7b0 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
2c7c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c7e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2c7f0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2c800 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2c810 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2c820 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c830 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
2c840 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2c850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c860 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75   dropCell(leafCu
2c870 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2c880 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  .idx, szNext);. 
2c890 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2c8a0 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  e(leafCur.pPage,
2c8b0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2c8c0 71 6c 69 74 65 33 5f 66 72 65 65 28 74 65 6d 70  qlite3_free(temp
2c8d0 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Cell);.    sqlit
2c8e0 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
2c8f0 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75  mpCursor(&leafCu
2c900 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2c910 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2c920 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2c930 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2c940 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ,.       pCur->p
2c950 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
2c960 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70  pgno));.    drop
2c970 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c980 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2c990 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c9a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  );.    rc = bala
2c9b0 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2c9c0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2c9d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
2c9e0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2c9f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ca00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2ca10 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
2ca20 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
2ca30 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
2ca40 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
2ca50 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2ca60 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
2ca70 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
2ca80 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
2ca90 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
2caa0 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
2cab0 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
2cac0 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
2cad0 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
2cae0 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
2caf0 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
2cb00 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
2cb10 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
2cb20 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
2cb30 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
2cb40 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
2cb50 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
2cb60 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
2cb70 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
2cb80 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
2cb90 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
2cba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2cbb0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2cbc0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2cbd0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2cbe0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2cbf0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
2cc00 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2cc10 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
2cc20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2cc30 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2cc40 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2cc50 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2cc60 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2cc70 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2cc80 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2cc90 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
2cca0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2ccb0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2ccc0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2ccd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2cce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2ccf0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2cd00 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
2cd10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2cd20 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2cd30 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2cd40 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2cd50 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2cd60 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2cd70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2cd80 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
2cd90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2cda0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
2cdb0 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
2cdc0 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
2cdd0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2cde0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
2cdf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ce00 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
2ce10 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
2ce20 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
2ce30 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
2ce40 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
2ce50 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
2ce60 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
2ce70 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
2ce80 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
2ce90 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
2cea0 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
2ceb0 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
2cec0 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
2ced0 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
2cee0 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
2cef0 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
2cf00 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
2cf10 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
2cf20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
2cf30 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2cf40 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
2cf50 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
2cf60 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
2cf70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2cf80 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
2cf90 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
2cfa0 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2cfb0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
2cfc0 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
2cfd0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2cfe0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2cff0 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
2d000 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
2d010 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
2d020 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2d030 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2d040 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
2d050 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
2d060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d080 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
2d090 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2d0a0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2d0b0 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2d0c0 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2d0d0 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2d0e0 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2d0f0 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2d100 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
2d110 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2d120 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2d130 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2d140 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2d150 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2d160 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2d170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2d180 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2d190 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2d1a0 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2d1b0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2d1c0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2d1d0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2d1e0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2d1f0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2d200 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2d210 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2d220 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2d230 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2d240 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2d250 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2d260 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2d270 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2d280 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2d290 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d2a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d2b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d2c0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2d2d0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2d2e0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2d2f0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2d300 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2d310 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2d320 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2d330 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2d340 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2d350 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2d360 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2d370 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2d380 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2d390 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2d3a0 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2d3b0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2d3c0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2d3d0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2d3e0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2d3f0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2d400 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2d410 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2d420 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2d430 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2d440 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2d450 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2d460 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2d470 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2d480 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2d490 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2d4a0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2d4b0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2d4c0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2d4d0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2d4e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d500 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d510 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2d520 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2d530 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2d540 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2d550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d560 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2d570 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2d580 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2d590 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2d5a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d5b0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d5c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2d5e0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2d5f0 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2d600 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2d610 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2d620 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d630 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2d640 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2d650 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d670 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d680 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2d690 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2d6a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2d6b0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2d6c0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2d6d0 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2d6e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d6f0 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
2d700 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
2d710 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
2d720 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2d730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d760 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2d770 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
2d780 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2d790 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2d7a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d7b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d7c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d7d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d7e0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2d7f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2d800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d810 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2d820 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2d830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2d840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2d850 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2d860 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2d870 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2d880 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2d890 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2d8a0 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2d8b0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2d8c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2d8d0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2d8e0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2d8f0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2d900 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2d910 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d920 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d930 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2d940 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2d950 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2d960 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2d970 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2d980 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d990 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d9a0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2d9b0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2d9c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d9d0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2d9e0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2d9f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2da00 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2da10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2da20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2da30 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2da40 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2da50 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2da60 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2da70 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2da80 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2da90 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2daa0 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2dab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2dac0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2dad0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
2dae0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
2daf0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
2db00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2db10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
2db20 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
2db30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
2db40 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
2db50 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c  e(p, piTable, fl
2db60 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
2db70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2db80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2db90 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69  .** Erase the gi
2dba0 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  ven database pag
2dbb0 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68  e and all its ch
2dbc0 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a  ildren.  Return.
2dbd0 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  ** the page to t
2dbe0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
2dbf0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2dc00 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20  DatabasePage(.  
2dc10 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2dc20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2dc30 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61  BTree that conta
2dc40 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ins the table */
2dc50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
2dc60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2dc70 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72   number to clear
2dc80 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2dc90 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
2dca0 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c  arent page.  NUL
2dcb0 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a  L for the root *
2dcc0 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65  /.  int freePage
2dcd0 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61  Flag      /* Dea
2dce0 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20  llocate page if 
2dcf0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  true */.){.  Mem
2dd00 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2dd10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
2dd20 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2dd30 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  l;.  int i;..  a
2dd40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2dd50 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2dd60 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2dd70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72  gno>sqlite3Pager
2dd80 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
2dd90 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
2dda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2ddb0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
2ddc0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2ddd0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
2dde0 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  &pPage, pParent)
2ddf0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2de00 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2de10 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69  age_out;.  for(i
2de20 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
2de30 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  ll; i++){.    pC
2de40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2de50 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
2de60 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2de70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65  {.      rc = cle
2de80 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2de90 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
2dea0 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  ll), pPage->pPar
2deb0 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ent, 1);.      i
2dec0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2ded0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2dee0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
2def0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2df00 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2df10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2df20 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2df30 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
2df40 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2df50 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2df60 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
2df70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2df80 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65  aData[8]), pPage
2df90 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20  ->pParent, 1);. 
2dfa0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2dfb0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2dfc0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2dfd0 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29  ( freePageFlag )
2dfe0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2dff0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65  age(pPage);.  }e
2e000 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
2e010 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e020 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2e030 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50  ==0 ){.    zeroP
2e040 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
2e050 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
2e060 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
2e070 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2e080 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2e090 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
2e0a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e0b0 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
2e0c0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
2e0d0 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
2e0e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61  e database.  iTa
2e0f0 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61  ble is.** the pa
2e100 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2e110 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2e120 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  le.  After this 
2e130 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c  routine returns,
2e140 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
2e150 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20  e is empty, but 
2e160 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a  still exists..**
2e170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e180 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2e190 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2e1a0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2e1b0 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73  pen.** read curs
2e1c0 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
2e1d0 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75  .  Open write cu
2e1e0 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20  rsors are moved 
2e1f0 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f  to the.** root o
2e200 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  f the table..*/.
2e210 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2e220 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65  ClearTable(Btree
2e230 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2e240 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
2e250 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2e260 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
2e270 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2e280 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
2e290 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2e2a0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2e2b0 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
2e2c0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2e2d0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2e2e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2e2f0 73 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65  se if( (rc = che
2e300 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
2e310 54 61 62 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49  Table, 0))!=SQLI
2e320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
2e330 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
2e340 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c  .  }else if( SQL
2e350 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2e360 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2e370 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b  , iTable, 0)) ){
2e380 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
2e390 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
2e3a0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2e3b0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2e3c0 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
2e3d0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
2e3e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2e3f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e400 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
2e410 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2e420 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64  n a table and ad
2e430 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  d the root of th
2e440 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68  e table to.** th
2e450 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63  e freelist.  Exc
2e460 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66  ept, the root of
2e470 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74   the principle t
2e480 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e  able (the one on
2e490 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e  .** page 1) is n
2e4a0 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68  ever added to th
2e4b0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
2e4c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2e4d0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
2e4e0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
2e4f0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
2e500 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20  n.** cursors on 
2e510 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2e520 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2e530 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68  s enabled and th
2e540 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65  e page at iTable
2e550 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
2e560 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  .** root page in
2e570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e580 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  le, then the las
2e590 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20  t root page .** 
2e5a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2e5b0 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e  file is moved in
2e5c0 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d  to the slot form
2e5d0 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2e5e0 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74  .** iTable and t
2e5f0 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f  hat last slot fo
2e600 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2e610 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  by the last root
2e620 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65   page.** is adde
2e630 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2e640 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61  t instead of iTa
2e650 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61  ble.  In this sa
2e660 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70  y, all.** root p
2e670 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74  ages are kept at
2e680 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2e690 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2e6a0 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  ile, which.** is
2e6b0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41   necessary for A
2e6c0 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72  UTOVACUUM to wor
2e6d0 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76  k right.  *piMov
2e6e0 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ed is set to the
2e6f0 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72   .** page number
2e700 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65   that used to be
2e710 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2e720 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
2e730 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f  before.** the mo
2e740 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20  ve.  If no page 
2e750 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d  gets moved, *piM
2e760 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30  oved is set to 0
2e770 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f  ..** The last ro
2e780 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72  ot page is recor
2e790 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61  ded in meta[3] a
2e7a0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  nd the value of.
2e7b0 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70  ** meta[3] is up
2e7c0 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72  dated by this pr
2e7d0 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ocedure..*/.stat
2e7e0 69 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70  ic int btreeDrop
2e7f0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2e800 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
2e810 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  *piMoved){.  int
2e820 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2e830 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53  pPage = 0;.  BtS
2e840 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2e850 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2e860 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2e870 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
2e880 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
2e890 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2e8a0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2e8b0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2e8c0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2e8d0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
2e8e0 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
2e8f0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
2e900 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
2e910 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
2e920 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
2e930 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
2e940 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2e950 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
2e960 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
2e970 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
2e980 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
2e990 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
2e9a0 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
2e9b0 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
2e9c0 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
2e9d0 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
2e9e0 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
2e9f0 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
2ea00 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
2ea10 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
2ea20 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2ea30 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2ea40 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2ea50 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2ea60 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  le, &pPage, 0);.
2ea70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ea80 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
2ea90 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2eaa0 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a  ble(p, iTable);.
2eab0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2eac0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2ead0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
2eae0 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
2eaf0 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
2eb00 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
2eb10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2eb20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
2eb30 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2eb40 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2eb50 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
2eb60 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2eb70 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2eb80 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
2eb90 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
2eba0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2ebb0 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
2ebc0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
2ebd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ebe0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2ebf0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2ec00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2ec10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ec20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
2ec30 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
2ec40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
2ec50 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2ec60 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
2ec70 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2ec80 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
2ec90 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
2eca0 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
2ecb0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2ecc0 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
2ecd0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2ece0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2ecf0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2ed00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ed10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2ed20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ed30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2ed40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2ed50 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2ed60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2ed70 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
2ed80 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
2ed90 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2eda0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2edb0 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2edc0 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
2edd0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
2ede0 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
2edf0 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
2ee00 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2ee10 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
2ee20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ee30 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
2ee40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2ee50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2ee60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ee70 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
2ee80 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
2ee90 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
2eea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eeb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2eec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2eed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2eee0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
2eef0 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52  (pBt, pMove, PTR
2ef00 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
2ef10 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
2ef20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
2ef30 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
2ef40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ef50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2ef60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ef70 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
2ef80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2ef90 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2efa0 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2efb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2efc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2efd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2efe0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2eff0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2f000 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2f010 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f020 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2f030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2f050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2f060 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f   }.        *piMo
2f070 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e  ved = maxRootPgn
2f080 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
2f090 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77    /* Set the new
2f0a0 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27   'max-root-page'
2f0b0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61   value in the da
2f0c0 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54  tabase header. T
2f0d0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
2f0e0 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65  the old value le
2f0f0 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65  ss one, less one
2f100 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61   more if that ha
2f110 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a  ppens to.      *
2f120 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  * be a root-page
2f130 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e   number, less on
2f140 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20  e again if that 
2f150 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
2f160 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2f170 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  E..      */.    
2f180 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2f190 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2f1a0 6f 74 50 67 6e 6f 3d 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 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2f1d0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2f1e0 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2f1f0 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50  otPgno==PTRMAP_P
2f200 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f  AGENO(pBt, maxRo
2f210 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  otPgno) ){.     
2f220 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2f230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f240 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50  assert( maxRootP
2f250 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2f260 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2f270 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f280 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2f290 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50  a(p, 4, maxRootP
2f2a0 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gno);.    }else{
2f2b0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2f2c0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f2d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f2e0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
2f2f0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
2f300 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74   /* If sqlite3Bt
2f310 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73  reeDropTable was
2f320 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
2f330 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61  1. */.    zeroPa
2f340 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e  ge(pPage, PTF_IN
2f350 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b  TKEY|PTF_LEAF );
2f360 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2f370 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
2f380 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e  eturn rc;  .}.in
2f390 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  t sqlite3BtreeDr
2f3a0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2f3b0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2f3c0 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2f3d0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2f3e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2f3f0 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
2f400 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
2f410 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54  eDropTable(p, iT
2f420 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a  able, piMoved);.
2f430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2f440 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2f450 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2f460 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
2f470 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
2f480 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2f490 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2f4a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2f4b0 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
2f4c0 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
2f4d0 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
2f4e0 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
2f4f0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
2f500 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
2f510 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
2f520 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
2f530 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
2f540 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
2f550 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
2f560 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
2f570 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
2f580 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
2f590 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
2f5a0 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
2f5b0 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
2f5c0 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
2f5d0 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
2f5e0 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
2f5f0 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
2f600 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
2f610 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
2f620 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
2f630 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
2f640 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
2f650 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20  Meta){.  DbPage 
2f660 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20  *pDbPage;.  int 
2f670 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2f680 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68  har *pP1;.  BtSh
2f690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2f6a0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
2f6b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
2f6c0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
2f6d0 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20  .  /* Reading a 
2f6e0 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
2f6f0 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  requires a read-
2f700 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28  lock on page 1 (
2f710 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74  and hence.  ** t
2f720 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2f730 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20   table. We grab 
2f740 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64  this lock regard
2f750 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2f760 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  or.  ** not the 
2f770 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2f780 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
2f790 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f  et (the table ro
2f7a0 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a  oted at page.  *
2f7b0 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61  * 1 is treated a
2f7c0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
2f7d0 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f   by queryTableLo
2f7e0 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62  ck() and lockTab
2f7f0 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  le())..  */.  rc
2f800 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
2f810 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
2f820 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
2f830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2f840 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f850 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
2f860 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
2f870 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2f880 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73  <=15 );.  rc = s
2f890 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2f8a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26  Bt->pPager, 1, &
2f8b0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2f8c0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
2f8d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2f8e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f8f0 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69   }.  pP1 = (unsi
2f900 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
2f910 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2f920 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65  pDbPage);.  *pMe
2f930 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ta = get4byte(&p
2f940 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b  P1[36 + idx*4]);
2f950 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2f960 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a  nref(pDbPage);..
2f970 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
2f980 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
2f990 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
2f9a0 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
2f9b0 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
2f9c0 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
2f9d0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
2f9e0 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
2f9f0 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
2fa00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2fa10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fa20 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
2fa30 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
2fa40 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
2fa50 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20  ndif..  /* Grab 
2fa60 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  the read-lock on
2fa70 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63   page 1. */.  rc
2fa80 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
2fa90 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
2faa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2fab0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2fac0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
2fad0 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
2fae0 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
2faf0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
2fb00 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
2fb10 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
2fb20 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
2fb30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2fb40 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
2fb50 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
2fb60 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
2fb70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2fb80 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2fb90 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
2fba0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
2fbb0 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
2fbc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
2fbd0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
2fbe0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
2fbf0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2fc00 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2fc10 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2fc20 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2fc30 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2fc40 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
2fc50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2fc60 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
2fc70 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50     pP1 = pBt->pP
2fc80 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
2fc90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fca0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2fcb0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2fcc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fcd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
2fce0 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
2fcf0 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
2fd00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fd10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fd20 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37        if( idx==7
2fd30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2fd40 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2fd50 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20  uum || iMeta==0 
2fd60 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2fd70 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69  t( iMeta==0 || i
2fd80 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Meta==1 );.     
2fd90 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
2fda0 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20  um = iMeta;.    
2fdb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2fdc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
2fdd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
2fde0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fdf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c  ** Return the fl
2fe00 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62  ag byte at the b
2fe10 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2fe20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75  page that the cu
2fe30 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
2fe40 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
2fe50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fe60 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72  BtreeFlags(BtCur
2fe70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2fe80 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75   TODO: What abou
2fe90 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  t CURSOR_REQUIRE
2fea0 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62  SEEK state? Prob
2feb0 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c  ably need to cal
2fec0 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72  l.  ** restoreOr
2fed0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2fee0 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f  ion() here..  */
2fef0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2ff00 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2ff10 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2ff20 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2ff30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ff40 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d  Page->pBt==pCur-
2ff50 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e  >pBt );.  return
2ff60 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
2ff70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2ff80 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a  Offset] : 0;.}..
2ff90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2ffa0 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74  e pager associat
2ffb0 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e  ed with a BTree.
2ffc0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2ffd0 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
2ffe0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
2fff0 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67  ing only..*/.Pag
30000 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  er *sqlite3Btree
30010 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b  Pager(Btree *p){
30020 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
30030 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66  ->pPager;.}..#if
30040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30050 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
30060 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
30070 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65  message to the e
30080 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
30090 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
300a0 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d  oid checkAppendM
300b0 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  sg(.  IntegrityC
300c0 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61  k *pCheck,.  cha
300d0 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73  r *zMsg1,.  cons
300e0 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
300f0 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c  .  ....){.  va_l
30100 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
30110 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70 43  zMsg2;.  if( !pC
30120 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65  heck->mxErr ) re
30130 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  turn;.  pCheck->
30140 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63  mxErr--;.  pChec
30150 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f  k->nErr++;.  va_
30160 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
30170 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71  t);.  zMsg2 = sq
30180 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 30 2c  lite3VMPrintf(0,
30190 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
301a0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
301b0 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d  f( zMsg1==0 ) zM
301c0 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28 20  sg1 = "";.  if( 
301d0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20  pCheck->zErrMsg 
301e0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c  ){.    char *zOl
301f0 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  d = pCheck->zErr
30200 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d  Msg;.    pCheck-
30210 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
30220 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
30230 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
30240 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c  Msg, zOld, "\n",
30250 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
30260 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71  char*)0);.    sq
30270 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29  lite3_free(zOld)
30280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
30290 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
302a0 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67  &pCheck->zErrMsg
302b0 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
302c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20  (char*)0);.  }. 
302d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
302e0 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  sg2);.}.#endif /
302f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
30300 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
30310 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30320 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30330 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CHECK./*.** Add 
30340 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  1 to the referen
30350 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
30360 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68 69  e iPage.  If thi
30370 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  s is the second.
30380 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
30390 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e  the page, add an
303a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
303b0 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  o pCheck->zErrMs
303c0 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  g..** Return 1 i
303d0 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f 72  f there are 2 or
303e0 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65  e more reference
303f0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  s to the page an
30400 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69  d 0 if.** if thi
30410 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  s is the first r
30420 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
30430 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  page..**.** Also
30440 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
30450 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69  page number is i
30460 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61  n bounds..*/.sta
30470 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66  tic int checkRef
30480 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43  (IntegrityCk *pC
30490 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c  heck, int iPage,
304a0 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29   char *zContext)
304b0 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  {.  if( iPage==0
304c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
304d0 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d  f( iPage>pCheck-
304e0 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c  >nPage || iPage<
304f0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
30500 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
30510 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c  zContext, "inval
30520 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25  id page number %
30530 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
30540 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
30550 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65  if( pCheck->anRe
30560 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20  f[iPage]==1 ){. 
30570 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
30580 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
30590 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e  xt, "2nd referen
305a0 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20  ce to page %d", 
305b0 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
305c0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
305d0 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52  rn  (pCheck->anR
305e0 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a  ef[iPage]++)>1;.
305f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
30600 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30610 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  M./*.** Check th
30620 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  at the entry in 
30630 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
30640 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20  for page iChild 
30650 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65  maps to .** page
30660 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65   iParent, pointe
30670 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20  r type ptrType. 
30680 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61  If not, append a
30690 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
306a0 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f  ** to pCheck..*/
306b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
306c0 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65  ckPtrmap(.  Inte
306d0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
306e0 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20     /* Integrity 
306f0 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f  check context */
30700 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
30710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
30720 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ld page number *
30730 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
30740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
30750 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
30760 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e  ap type */.  Pgn
30770 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20  o iParent,      
30780 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
30790 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65  pointer map pare
307a0 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  nt page number *
307b0 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
307c0 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  xt         /* Co
307d0 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f  ntext descriptio
307e0 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f  n (used for erro
307f0 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69  r msg) */.){.  i
30800 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72  nt rc;.  u8 ePtr
30810 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20  mapType;.  Pgno 
30820 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a  iPtrmapParent;..
30830 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
30840 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43  (pCheck->pBt, iC
30850 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79  hild, &ePtrmapTy
30860 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65  pe, &iPtrmapPare
30870 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
30880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30890 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
308a0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
308b0 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
308c0 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
308d0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
308e0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
308f0 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
30900 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
30910 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
30920 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
30930 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30940 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
30950 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
30960 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
30970 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
30980 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
30990 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
309a0 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
309b0 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
309c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
309d0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
309e0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
309f0 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
30a00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
30a10 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
30a20 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
30a30 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
30a40 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
30a50 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
30a60 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
30a70 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
30a80 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
30a90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
30aa0 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
30ab0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
30ac0 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
30ad0 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
30ae0 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
30af0 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
30b00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30b10 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
30b20 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
30b30 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b50 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
30b60 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
30b70 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
30b80 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
30b90 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
30ba0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
30bb0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
30bc0 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b  nt expected = N;
30bd0 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
30be0 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20  iPage;.  while( 
30bf0 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63  N-- > 0 && pChec
30c00 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20  k->mxErr ){.    
30c10 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67  DbPage *pOvflPag
30c20 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
30c30 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b  char *pOvflData;
30c40 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31  .    if( iPage<1
30c50 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
30c60 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30c70 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
30c80 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61      "%d of %d pa
30c90 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  ges missing from
30ca0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73   overflow list s
30cb0 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a  tarting at %d",.
30cc0 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65            N+1, e
30cd0 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29  xpected, iFirst)
30ce0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
30d00 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
30d10 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29  age, zContext) )
30d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
30d30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
30d40 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20  pCheck->pPager, 
30d50 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f  (Pgno)iPage, &pO
30d60 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20  vflPage) ){.    
30d70 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30d80 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30d90 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65  t, "failed to ge
30da0 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  t page %d", iPag
30db0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
30dc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c  .    }.    pOvfl
30dd0 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  Data = (unsigned
30de0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
30df0 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76 66  agerGetData(pOvf
30e00 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  lPage);.    if( 
30e10 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20  isFreeList ){.  
30e20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34      int n = get4
30e30 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
30e40 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
30e50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30e60 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43  UUM.      if( pC
30e70 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
30e80 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
30e90 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
30ea0 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  eck, iPage, PTRM
30eb0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
30ec0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
30ed0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
30ee0 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42  if( n>pCheck->pB
30ef0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  t->usableSize/4-
30f00 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  8 ){.        che
30f10 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30f20 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
30f30 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69           "freeli
30f40 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f  st leaf count to
30f50 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64  o big on page %d
30f60 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
30f70 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65     N--;.      }e
30f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
30f90 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
30fa0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
30fb0 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34  iFreePage = get4
30fc0 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
30fd0 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66  8+i*4]);.#ifndef
30fe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30ff0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
31000 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
31010 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31020 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65  .            che
31030 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31040 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d   iFreePage, PTRM
31050 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
31060 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31070 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31080 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66          checkRef
31090 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
310a0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
310b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
310c0 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   N -= n;.      }
310d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
310e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
310f0 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a  ACUUM.    else{.
31100 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
31110 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
31120 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  ts auto-vacuum a
31130 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20  nd iPage is not 
31140 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
31150 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f  * page in this o
31160 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68  verflow list, ch
31170 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69  eck that the poi
31180 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
31190 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  or.      ** the 
311a0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d  following page m
311b0 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20  atches iPage..  
311c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
311d0 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
311e0 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20  toVacuum && N>0 
311f0 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67  ){.        i = g
31200 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
31210 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63  a);.        chec
31220 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31230 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  i, PTRMAP_OVERFL
31240 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW2, iPage, zCon
31250 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
31260 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31270 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
31280 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
31290 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
312a0 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ef(pOvflPage);. 
312b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
312c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
312d0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
312e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
312f0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
31300 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69  CK./*.** Do vari
31310 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ous sanity check
31320 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  s on a single pa
31330 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52  ge of a tree.  R
31340 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65  eturn.** the tre
31350 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70  e depth.  Root p
31360 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20  ages return 0.  
31370 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20  Parents of root 
31380 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20  pages.** return 
31390 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  1, and so forth.
313a0 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68  .** .** These ch
313b0 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a  ecks are done:.*
313c0 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61  *.**      1.  Ma
313d0 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c  ke sure that cel
313e0 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b  ls and freeblock
313f0 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70  s do not overlap
31400 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74  .**          but
31410 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70   combine to comp
31420 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65  letely cover the
31430 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32   page..**  NO  2
31440 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c  .  Make sure cel
31450 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72  l keys are in or
31460 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20  der..**  NO  3. 
31470 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
31480 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
31490 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65  r equal to zLowe
314a0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20  rBound..**  NO  
314b0 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  4.  Make sure no
314c0 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20   key is greater 
314d0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
314e0 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zUpperBound..**
314f0 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20        5.  Check 
31500 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
31510 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
31520 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63  .**      6.  Rec
31530 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68  ursively call ch
31540 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61  eckTreePage on a
31550 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20  ll children..** 
31560 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20       7.  Verify 
31570 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f  that the depth o
31580 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69  f all children i
31590 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20  s the same..**  
315a0 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72      8.  Make sur
315b0 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  e this page is a
315c0 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c  t least 33% full
315d0 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a   or else it is.*
315e0 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72  *          the r
315f0 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
31600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
31610 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20  heckTreePage(.  
31620 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
31630 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74  eck,  /* Context
31640 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20   for the sanity 
31650 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
31660 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
31670 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
31680 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63  of the page to c
31690 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  heck */.  MemPag
316a0 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
316b0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a  /* Parent page *
316c0 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  /.  char *zParen
316d0 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72  tContext  /* Par
316e0 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ent context */.)
316f0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
31700 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c  ge;.  int i, rc,
31710 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f   depth, d2, pgno
31720 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72  , cnt;.  int hdr
31730 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69  , cellStart;.  i
31740 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a  nt nCell;.  u8 *
31750 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  data;.  BtShared
31760 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61   *pBt;.  int usa
31770 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20  bleSize;.  char 
31780 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20  zContext[100];. 
31790 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73   char *hit;..  s
317a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
317b0 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
317c0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67  , zContext, "Pag
317d0 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  e %d: ", iPage);
317e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
317f0 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74  t the page exist
31800 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70  s.  */.  pBt = p
31810 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73  Check->pBt;.  us
31820 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
31830 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66  usableSize;.  if
31840 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
31850 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65  urn 0;.  if( che
31860 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
31870 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74  age, zParentCont
31880 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ext) ) return 0;
31890 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
318a0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
318b0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67  (pBt, (Pgno)iPag
318c0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
318d0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
318e0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
318f0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31900 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
31910 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20  the page. error 
31920 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20  code=%d", rc);. 
31930 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31940 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
31950 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
31960 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
31970 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
31980 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31990 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65 49    "sqlite3BtreeI
319c0 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
319d0 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
319e0 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
319f0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
31a00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31a10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
31a20 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
31a30 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
31a40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
31a50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70  Page->nCell && p
31a60 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b  Check->mxErr; i+
31a70 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
31a80 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
31a90 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
31aa0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
31ab0 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77  payload overflow
31ac0 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20   pages.    */.  
31ad0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31ae0 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
31af0 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  xt), zContext,. 
31b00 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
31b10 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65 6c  tree page %d cel
31b20 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20  l %d: ", iPage, 
31b30 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  i);.    pCell = 
31b40 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69  findCell(pPage,i
31b50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
31b60 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
31b70 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
31b80 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69  nfo);.    sz = i
31b90 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69  nfo.nData;.    i
31ba0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
31bb0 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e  y ) sz += info.n
31bc0 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
31bd0 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f   sz==info.nPaylo
31be0 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  ad );.    if( sz
31bf0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
31c00 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
31c10 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  = (sz - info.nLo
31c20 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65  cal + usableSize
31c30 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a   - 5)/(usableSiz
31c40 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67  e - 4);.      Pg
31c50 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
31c60 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
31c70 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
31c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31c90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31ca0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
31cb0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31cc0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31cd0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c  pCheck, pgnoOvfl
31ce0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
31cf0 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W1, iPage, zCont
31d00 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
31d10 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b  ndif.      check
31d20 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20  List(pCheck, 0, 
31d30 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c  pgnoOvfl, nPage,
31d40 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31d50 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
31d60 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63  sanity of left c
31d70 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a  hild page..    *
31d80 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
31d90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31da0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31db0 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  pCell);.#ifndef 
31dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31dd0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
31de0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31df0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31e00 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31e10 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
31e20 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  EE, iPage, zCont
31e30 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
31e40 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20  ndif.      d2 = 
31e50 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
31e60 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c  heck,pgno,pPage,
31e70 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
31e80 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d   if( i>0 && d2!=
31e90 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20  depth ){.       
31ea0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31eb0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31ec0 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64 65  , "Child page de
31ed0 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20  pth differs");. 
31ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70       }.      dep
31ef0 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20  th = d2;.    }. 
31f00 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
31f10 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
31f20 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
31f30 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
31f40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
31f50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
31f60 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
31f70 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
31f80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
31f90 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65          "On page
31fa0 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69   %d at right chi
31fb0 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23  ld: ", iPage);.#
31fc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31fd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31fe0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31ff0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63  acuum ){.      c
32000 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
32010 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  k, pgno, PTRMAP_
32020 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29  BTREE, iPage, 0)
32030 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32040 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
32050 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70  (pCheck, pgno, p
32060 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
32070 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63  .  }. .  /* Chec
32080 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63  k for complete c
32090 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70  overage of the p
320a0 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20  age.  */.  data 
320b0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
320c0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
320d0 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20  drOffset;.  hit 
320e0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
320f0 65 72 6f 28 20 75 73 61 62 6c 65 53 69 7a 65 20  ero( usableSize 
32100 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a  );.  if( hit ){.
32110 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
32120 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  1, get2byte(&dat
32130 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20  a[hdr+5]));.    
32140 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
32150 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
32160 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
32170 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
32180 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
32190 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
321a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
321b0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
321c0 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
321d0 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  2]);.      int s
321e0 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
321f0 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
32200 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  c]);.      int j
32210 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b  ;.      if( (pc+
32220 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
32230 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20  ize || pc<0 ){. 
32240 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
32250 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
32260 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
32270 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
32280 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
32290 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
322a0 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
322b0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
322c0 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70  =pc+size-1; j>=p
322d0 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  c; j--) hit[j]++
322e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
322f0 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69      for(cnt=0, i
32300 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
32310 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20  hdr+1]); i>0 && 
32320 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  i<usableSize && 
32330 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20  cnt<10000; .    
32340 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20         cnt++){. 
32350 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
32360 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
32370 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  +2]);.      int 
32380 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b  j;.      if( (i+
32390 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
323a0 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20  ize || i<0 ){.  
323b0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
323c0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
323d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
323e0 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
323f0 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
32400 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
32410 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
32420 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
32430 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b  =i+size-1; j>=i;
32440 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a   j--) hit[j]++;.
32450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
32460 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
32470 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
32480 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75  for(i=cnt=0; i<u
32490 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  sableSize; i++){
324a0 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69  .      if( hit[i
324b0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
324c0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
324d0 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20  se if( hit[i]>1 
324e0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
324f0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32500 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22  , 0,.          "
32510 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f  Multiple uses fo
32520 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67  r byte %d of pag
32530 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29  e %d", i, iPage)
32540 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
32550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32560 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61     if( cnt!=data
32570 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20  [hdr+7] ){.     
32580 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32590 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
325a0 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65        "Fragmente
325b0 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79  d space is %d by
325c0 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25  te reported as %
325d0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20  d on page %d",. 
325e0 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61           cnt, da
325f0 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65  ta[hdr+7], iPage
32600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
32610 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 74 29  qlite3_free(hit)
32620 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
32630 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
32640 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
32650 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
32660 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
32670 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
32680 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
32690 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
326a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
326b0 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
326c0 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
326d0 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
326e0 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
326f0 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
32700 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
32710 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
32720 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
32730 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
32740 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
32750 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
32760 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Root..**.** If e
32770 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73  verything checks
32780 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69   out, this routi
32790 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
327a0 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69    If something i
327b0 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65  s.** amiss, an e
327c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
327d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
327e0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
327f0 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e  m malloc().** an
32800 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
32810 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67  hat error messag
32820 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
32830 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
32840 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
32850 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
32860 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
32870 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  sage when it is 
32880 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  done..*/.char *s
32890 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
328a0 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72  rityCheck(.  Btr
328b0 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68  ee *p,     /* Th
328c0 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63 68  e btree to be ch
328d0 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  ecked */.  int *
328e0 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61  aRoot,   /* An a
328f0 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67  rray of root pag
32900 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69  es numbers for i
32910 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73 20  ndividual trees 
32920 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20  */.  int nRoot, 
32930 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32940 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
32950 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72  [] */.  int mxEr
32960 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65  r,    /* Stop re
32970 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61  porting errors a
32980 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a  fter this many *
32990 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20  /.  int *pnErr  
329a0 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65    /* Write numbe
329b0 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
329c0 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c   to this variabl
329d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
329e0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49  .  int nRef;.  I
329f0 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65 63  ntegrityCk sChec
32a00 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  k;.  BtShared *p
32a10 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
32a20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
32a30 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
32a40 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20  = p->db;.  nRef 
32a50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
32a60 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
32a70 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
32a80 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
32a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32aa0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
32ab0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
32ac0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44 75  urn sqlite3StrDu
32ad0 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
32ae0 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
32af0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32b00 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
32b10 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
32b20 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
32b30 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
32b40 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
32b50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
32b60 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
32b70 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
32b80 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
32b90 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
32ba0 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64  pnErr = 0;.#ifnd
32bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32bc0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
32bd0 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29  pBt->nTrunc!=0 )
32be0 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61  {.    sCheck.nPa
32bf0 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ge = pBt->nTrunc
32c00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
32c10 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
32c20 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
32c30 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
32c40 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  t);.    sqlite3B
32c50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32c60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
32c70 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d    sCheck.anRef =
32c80 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
32c90 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
32ca0 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
32cb0 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
32cc0 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
32cd0 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
32ce0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
32cf0 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
32d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
32d10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
32d20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50  return sqlite3MP
32d30 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e  rintf(p->db, "Un
32d40 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25  able to malloc %
32d50 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20  d bytes", .     
32d60 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65     (sCheck.nPage
32d70 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
32d80 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20  k.anRef[0]));.  
32d90 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  }.  for(i=0; i<=
32da0 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b  sCheck.nPage; i+
32db0 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  +){ sCheck.anRef
32dc0 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d  [i] = 0; }.  i =
32dd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
32de0 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69  GE(pBt);.  if( i
32df0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29  <=sCheck.nPage )
32e00 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52  {.    sCheck.anR
32e10 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  ef[i] = 1;.  }. 
32e20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20   sCheck.zErrMsg 
32e30 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
32e40 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
32e50 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
32e60 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
32e70 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
32e80 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
32e90 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
32ea0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
32eb0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
32ec0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
32ed0 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
32ee0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
32ef0 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
32f00 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
32f10 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e  nRoot && sCheck.
32f20 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
32f30 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
32f40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
32f50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32f60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32f70 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
32f80 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
32f90 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
32fa0 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
32fb0 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
32fc0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
32fd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32fe0 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
32ff0 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
33000 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
33010 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
33020 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
33030 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
33040 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
33050 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
33060 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
33070 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
33080 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
33090 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
330a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
330b0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
330c0 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
330d0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
330e0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
330f0 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
33100 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
33110 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
33120 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
33130 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
33140 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
33150 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
33160 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
33170 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
33180 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
33190 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
331a0 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
331b0 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
331c0 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
331d0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
331e0 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
331f0 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
33200 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
33210 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
33220 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
33230 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
33240 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
33250 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
33260 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
33270 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
33280 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
33290 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
332a0 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
332b0 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
332c0 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
332d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
332e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
332f0 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
33300 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
33310 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
33320 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
33330 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
33340 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
33350 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
33360 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
33370 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
33380 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
33390 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
333a0 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
333b0 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
333c0 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
333d0 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
333e0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
333f0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
33400 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
33410 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
33420 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
33430 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
33440 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
33450 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
33460 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a  heck.anRef);.  *
33470 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e  pnErr = sCheck.n
33480 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 43  Err;.  return sC
33490 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a  heck.zErrMsg;.}.
334a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
334b0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
334c0 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CHECK */../*.** 
334d0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
334e0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
334f0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
33500 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
33510 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61  The pager filena
33520 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
33530 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
33540 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
33550 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
33560 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
33570 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
33580 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
33590 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
335a0 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65  etFilename(Btree
335b0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
335c0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
335d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
335e0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
335f0 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
33600 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
33610 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
33620 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
33630 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
33640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33650 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
33660 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  er directory nam
33670 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
33680 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
33690 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
336a0 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
336b0 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
336c0 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
336d0 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
336e0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
336f0 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a  tDirname(Btree *
33700 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
33710 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
33720 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
33730 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
33740 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
33750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33760 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
33770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
33780 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  e for this datab
33790 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a  ase. The return.
337a0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
337b0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
337c0 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20  same regardless 
337d0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a  of whether the j
337e0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
337f0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
33800 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  or not..**.** Th
33810 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20  e pager journal 
33820 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61  filename is inva
33830 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
33840 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
33850 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
33860 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
33870 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
33880 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
33890 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
338a0 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
338b0 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
338c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
338d0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
338e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
338f0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
33900 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
33910 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
33920 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
33930 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
33940 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
33950 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
33960 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
33970 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
33980 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
33990 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
339a0 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74  size of file pBt
339b0 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75  From may be redu
339c0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
339d0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
339e0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
339f0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
33a00 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20  n on pBtFrom is 
33a10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
33a20 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
33a30 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
33a40 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
33a50 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
33a60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
33a70 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61   i, nPage, nToPa
33a80 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74  ge, iSkip;..  Bt
33a90 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
33aa0 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
33ab0 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
33ac0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42  pFrom->pBt;.  pB
33ad0 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64  tTo->db = pTo->d
33ae0 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62  b;.  pBtFrom->db
33af0 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 20 20   = pFrom->db;.  
33b00 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
33b10 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
33b20 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
33b30 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
33b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33b50 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
33b60 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
33b70 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53  ursor ) return S
33b80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54  QLITE_BUSY;.  nT
33b90 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
33ba0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
33bb0 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
33bc0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  nPage = sqlite3P
33bd0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
33be0 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
33bf0 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
33c00 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
33c10 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  o);.  for(i=1; r
33c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33c30 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
33c40 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
33c50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
33c60 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
33c70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33c80 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
33c90 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  om->pPager, i, &
33ca0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33cb0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33cd0 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42 74  gerOverwrite(pBt
33ce0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 73  To->pPager, i, s
33cf0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
33d00 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20 20  ta(pDbPage));.  
33d10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33d20 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
33d30 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  }..  /* If the f
33d40 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69 6e 67  ile is shrinking
33d50 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20 70 61  , journal the pa
33d60 67 65 73 20 74 68 61 74 20 61 72 65 20 62 65 69  ges that are bei
33d70 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20 20 2a  ng truncated.  *
33d80 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  * so that they c
33d90 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
33da0 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  k if the commit 
33db0 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  fails..  */.  fo
33dc0 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d  r(i=nPage+1; rc=
33dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
33de0 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  =nToPage; i++){.
33df0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
33e00 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
33e10 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
33e20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33e30 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f  e3PagerGet(pBtTo
33e40 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44  ->pPager, i, &pD
33e50 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
33e60 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
33e70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33e80 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
33e90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
33ea0 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61  rDontWrite(pDbPa
33eb0 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65 61 68  ge);.    /* Yeah
33ec0 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72  .  It seems wier
33ed0 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72  d to call DontWr
33ee0 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65  ite() right afte
33ef0 72 20 57 72 69 74 65 28 29 2e 20 20 42 75 74 0a  r Write().  But.
33f00 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62      ** that is b
33f10 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73  ecause the names
33f20 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64   of those proced
33f30 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63  ures do not exac
33f40 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65 70 72  tly .    ** repr
33f50 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20  esent what they 
33f60 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61  do.  Write() rea
33f70 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74  lly means "put t
33f80 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a  his page in the.
33f90 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
33fa0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
33fb0 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
33fc0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
33fd0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 74  written.    ** t
33fe0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33ff0 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e  ile later."  Don
34000 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20  tWrite() undoes 
34010 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20  the second part 
34020 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  of.    ** that a
34030 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  nd prevents the 
34040 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20  page from being 
34050 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
34060 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a 20 20  atabase.  The.  
34070 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69    ** page is sti
34080 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ll on the rollba
34090 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75  ck journal, thou
340a0 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73  gh.  And that is
340b0 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20 2a   the whole.    *
340c0 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20  * point of this 
340d0 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70 61 67  loop: to put pag
340e0 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
340f0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ck journal. */. 
34100 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
34110 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
34120 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20   }.  if( !rc && 
34130 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b  nPage<nToPage ){
34140 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34150 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
34160 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50  BtTo->pPager, nP
34170 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
34180 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
34190 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
341a0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
341b0 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
341c0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
341d0 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
341e0 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
341f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
34200 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f  e3BtreeEnter(pTo
34210 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
34220 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20  eEnter(pFrom);. 
34230 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46   rc = btreeCopyF
34240 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b  ile(pTo, pFrom);
34250 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
34260 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
34270 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34280 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
34290 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
342a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
342b0 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UUM */../*.** Re
342c0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
342d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
342e0 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
342f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
34300 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  nTrans(Btree *p)
34310 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
34320 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
34330 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
34340 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
34350 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
34360 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
34370 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
34380 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
34390 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
343a0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
343b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
343c0 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74  BtreeIsInStmt(Bt
343d0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
343e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
343f0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
34400 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
34410 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74   && p->pBt->inSt
34420 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
34430 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
34440 20 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74   a read (or writ
34450 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  e) transaction i
34460 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
34470 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
34480 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65  nReadTrans(Btree
34490 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
344a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
344b0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
344c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
344d0 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
344e0 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
344f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
34500 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
34510 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62  ointer to a blob
34520 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
34530 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  iated with.** a 
34540 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74  single shared-bt
34550 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  ree. The memory 
34560 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e  is used by clien
34570 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f  t code for its o
34580 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
34590 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
345a0 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
345b0 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
345c0 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
345d0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
345e0 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
345f0 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
34600 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
34610 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
34620 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
34630 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
34640 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
34650 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
34660 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
34670 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
34680 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
34690 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
346a0 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
346b0 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
346c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
346d0 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
346e0 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
346f0 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
34700 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
34710 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  * Just before th
34720 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69  e shared-btree i
34730 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75  s closed, the fu
34740 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73  nction passed as
34750 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61   the .** xFree a
34760 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65  rgument when the
34770 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
34780 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69  on was made is i
34790 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a  nvoked on the .*
347a0 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61  * blob of alloca
347b0 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  ted memory. This
347c0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
347d0 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65   not call sqlite
347e0 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74  3_free().** on t
347f0 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62  he memory, the b
34800 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20  tree layer does 
34810 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  that..*/.void *s
34820 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
34830 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
34840 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46  nBytes, void(*xF
34850 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20  ree)(void *)){. 
34860 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34870 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
34880 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
34890 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63  .  if( !pBt->pSc
348a0 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
348b0 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
348c0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79  e3MallocZero(nBy
348d0 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78  tes);.    pBt->x
348e0 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72  FreeSchema = xFr
348f0 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ee;.  }.  sqlite
34900 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
34910 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
34920 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
34930 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
34940 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
34950 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
34960 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
34970 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
34980 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
34990 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
349a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
349b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
349c0 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
349d0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
349e0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
349f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34a00 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
34a10 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
34a20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
34a30 72 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65  rc = (queryTable
34a40 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
34a50 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
34a60 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73  =SQLITE_OK);.  s
34a70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34a80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
34a90 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
34aa0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
34ab0 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
34ac0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
34ad0 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
34ae0 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
34af0 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
34b00 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
34b10 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
34b20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
34b30 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
34b40 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
34b50 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
34b60 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
34b70 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
34b80 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
34b90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34ba0 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28   u8 lockType = (
34bb0 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54  isWriteLock?WRIT
34bc0 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b  E_LOCK:READ_LOCK
34bd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
34be0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
34bf0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
34c00 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
34c10 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
34c20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34c30 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
34c40 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
34c50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
34c60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
34c80 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
34c90 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
34ca0 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
34cb0 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
34cc0 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
34cd0 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
34ce0 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
34cf0 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
34d00 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
34d10 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
34d20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
34d30 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
34d40 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
34d50 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
34d60 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
34d70 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
34d80 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
34d90 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
34da0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
34db0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
34dc0 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
34dd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34de0 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
34df0 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
34e00 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
34e10 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28  d *z){.  assert(
34e20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
34e30 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73  x(pCsr) );.  ass
34e40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
34e50 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42  ex_held(pCsr->pB
34e60 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
34e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73   );.  assert(pCs
34e80 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
34e90 64 6c 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72  dle);.  if( pCsr
34ea0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
34eb0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
34ec0 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53      if( pCsr->eS
34ed0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
34ee0 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
34ef0 72 6e 20 70 43 73 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCsr->skip;. 
34f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
34f20 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ORT;.    }.  }..
34f30 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20    /* Check some 
34f40 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a  preconditions: .
34f50 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63    **   (a) the c
34f60 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f  ursor is open fo
34f70 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20  r writing,.  ** 
34f80 20 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e    (b) there is n
34f90 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  o read-lock on t
34fa0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d  he table being m
34fb0 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a  odified and.  **
34fc0 20 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f     (c) the curso
34fd0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61  r points at a va
34fe0 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e  lid row of an in
34ff0 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  tKey table..  */
35000 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72  .  if( !pCsr->wr
35010 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
35020 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
35030 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  LY;.  }.  assert
35040 28 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65  ( !pCsr->pBt->re
35050 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  adOnly .        
35060 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e    && pCsr->pBt->
35070 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
35080 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
35090 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
350a0 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c  ks(pCsr->pBtree,
350b0 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCsr->pgnoRoot,
350c0 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20 72 65   pCsr) ){.    re
350d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
350e0 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
350f0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
35100 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
35110 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73  */.  }.  if( pCs
35120 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
35130 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43  R_INVALID || !pC
35140 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  sr->pPage->intKe
35150 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
35160 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
35170 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  }..  return acce
35180 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20  ssPayload(pCsr, 
35190 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
351a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c  signed char *)z,
351b0 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a   0, 1);.}../* .*
351c0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20  * Set a flag on 
351d0 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63  this cursor to c
351e0 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  ache the locatio
351f0 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d  ns of pages from
35200 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f   the .** overflo
35210 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63  w list for the c
35220 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73  urrent row. This
35230 20 69 73 20 75 73 65 64 20 62 79 20 63 75 72 73   is used by curs
35240 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f  ors opened.** fo
35250 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  r incremental bl
35260 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a  ob IO only..**.*
35270 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35280 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79  sets a flag only
35290 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 61 67  . The actual pag
352a0 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63 68 65  e location cache
352b0 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e 20 42  .** (stored in B
352c0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
352d0 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61 74 65  w[]) is allocate
352e0 64 20 61 6e 64 20 75 73 65 64 20 62 79 20 66 75  d and used by fu
352f0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73  nction.** access
35300 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65 20 77  Payload() (the w
35310 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  orker function f
35320 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
35330 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  ata() and.** sql
35340 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61  ite3BtreePutData
35350 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ())..*/.void sql
35360 69 74 65 33 42 74 72 65 65 43 61 63 68 65 4f 76  ite3BtreeCacheOv
35370 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f 72 20  erflow(BtCursor 
35380 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
35390 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
353a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
353b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
353c0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
353d0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
353e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70  ) );.  assert(!p
353f0 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
35400 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74  andle);.  assert
35410 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
35420 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e  w);.  pCur->isIn
35430 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31  crblobHandle = 1
35440 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.