/ Hex Artifact Content
Login

Artifact ac94b8a9b0fb042b0284c0db5575740d27872558:


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 32 36 20 32 30 30 37 2f 30  c,v 1.426 2007/0
0190: 39 2f 31 32 20 31 37 3a 30 31 3a 34 35 20 64 61  9/12 17:01:45 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 54 68 69 73 20 28    }..  /* This (
0c40: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
0c50: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
0c60: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0c70: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
0c80: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
0c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
0ca0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
0cb0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
0cc0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
0cd0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
0ce0: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
0cf0: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
0d00: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
0d10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
0d20: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
0d30: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
0d40: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
0d50: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
0d60: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
0d70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
0d80: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
0d90: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
0da0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
0db0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
0dc0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0dd0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
0de0: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
0df0: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
0e00: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
0e10: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
0e20: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
0e30: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
0e40: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
0e50: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
0e60: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
0e70: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
0e80: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
0e90: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
0ea0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
0eb0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
0ec0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
0ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
0ee0: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
0ef0: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
0f00: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
0f10: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0f20: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0f30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0f40: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
0f50: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
0f60: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
0f70: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
0f80: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
0f90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
0fa0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
0fb0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
0fc0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
0fd0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
0fe0: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
0ff0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
1000: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1010: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
1020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1040: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1050: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1060: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1080: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1090: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
10a0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
10b0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
10c0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
10d0: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
10e0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
10f0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
1100: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
1110: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
1120: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
1130: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1140: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
1150: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
1160: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
1170: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
1180: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
1190: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
11a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
11b0: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
11c0: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
11d0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
11e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11f0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
1200: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
1210: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1220: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1230: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1240: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
1250: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
1260: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
1270: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
1280: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
1290: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
12b0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
12c0: 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f  OK==queryTableLo
12d0: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
12e0: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
12f0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1300: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
1310: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
1320: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a  k is requested,.
1330: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
1340: 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67  y without adding
1350: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
1360: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
1370: 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63  list. See.  ** c
1380: 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69  omment in functi
1390: 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  on queryTableLoc
13a0: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
13b0: 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20  o on handling . 
13c0: 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f   ** the ReadUnco
13d0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20  mmitted flag..  
13e0: 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70  */.  if( .    (p
13f0: 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20  ->pSqlite) && . 
1400: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e     (p->pSqlite->
1410: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
1420: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26  dUncommitted) &&
1430: 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45   .    (eLock==RE
1440: 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20  AD_LOCK) &&.    
1450: 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52  iTable!=MASTER_R
1460: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  OOT.  ){.    ret
1470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1480: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73   }..  /* First s
1490: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
14a0: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
14b0: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
14c0: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
14d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
14e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
14f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1500: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
1510: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
1520: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
1530: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
1540: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1560: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
1570: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
1580: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
1590: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
15a0: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
15b0: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
15c0: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
15d0: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
15e0: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
15f0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
1600: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
1610: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1620: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
1630: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
1640: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
1650: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1660: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
1670: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
1680: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
1690: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
16a0: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
16b0: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
16c0: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
16d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
16e0: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
16f0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
1700: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
1710: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
1720: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1730: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
1740: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
1750: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
1760: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
1770: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
1780: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
1790: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
17a0: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
17b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
17c0: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
17d0: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
17e0: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
17f0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
1800: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
1810: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1820: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1830: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
1840: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
1850: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1860: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
1870: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
1880: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
1890: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
18a0: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74 68   via calls to th
18b0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a  e lockTable().**
18c0: 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64   procedure) held
18d0: 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65   by Btree handle
18e0: 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   p..*/.static vo
18f0: 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  id unlockAllTabl
1900: 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  es(Btree *p){.  
1910: 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20  BtLock **ppIter 
1920: 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b  = &p->pBt->pLock
1930: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1940: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1950: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1960: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1970: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1980: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1990: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
19a0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
19b0: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  r;.    if( pLock
19c0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
19d0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
19e0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
19f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a00: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  pLock);.    }els
1a10: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
1a20: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
1a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1a40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a50: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
1a60: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
1a70: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
1a80: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
1a90: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1aa0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  ce */../*.** Ver
1ab0: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
1ac0: 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65  sor holds a mute
1ad0: 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
1ae0: 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  d.*/.#ifndef NDE
1af0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
1b00: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b10: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1b20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1b30: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
1b40: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
1b50: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
1b60: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1b70: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
1b80: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1b90: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1ba0: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
1bb0: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1bc0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1bd0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1be0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1bf0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1c00: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1c10: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
1c20: 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
1c30: 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f  low);.  pCur->aO
1c40: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a  verflow = 0;.}..
1c50: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1c60: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1c70: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1c80: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
1c90: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
1ca0: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
1cb0: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
1cc0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
1cd0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1ce0: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
1cf0: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
1d00: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
1d10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1d20: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1d30: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
1d40: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1d50: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
1d60: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1d70: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  e(p);.  }.}.#els
1d80: 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  e.  #define inva
1d90: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1da0: 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65  che(x).  #define
1db0: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1dc0: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23  erflowCache(x).#
1dd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  endif../*.** Sav
1de0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
1df0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
1e00: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
1e10: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
1e20: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
1e30: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
1e40: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
1e50: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1e60: 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  EEK..*/.static i
1e70: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
1e80: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
1e90: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
1ea0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
1eb0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
1ec0: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
1ed0: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
1ee0: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
1ef0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f00: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
1f10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1f20: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
1f30: 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49  ->nKey);..  /* I
1f40: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
1f50: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
1f60: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
1f70: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
1f80: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
1f90: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
1fa0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
1fb0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
1fc0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
1fd0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
1fe0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1ff0: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
2000: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
2010: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
2020: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
2030: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
2040: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
2050: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
2060: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2070: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
2080: 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  =pCur->pPage->in
2090: 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20  tKey){.    void 
20a0: 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  *pKey = sqlite3_
20b0: 6d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65  malloc(pCur->nKe
20c0: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  y);.    if( pKey
20d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20e0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
20f0: 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b  Cur, 0, pCur->nK
2100: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
2110: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2120: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
2130: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
2140: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2160: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
2170: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2180: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2190: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
21a0: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
21b0: 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c  >pPage->intKey |
21c0: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
21d0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
21e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c  TE_OK ){.    rel
21f0: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
2200: 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
2210: 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >pPage = 0;.    
2220: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2230: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2240: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
2250: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
2260: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
2270: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
2280: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
2290: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
22a0: 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74 20   except pExcept 
22b0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c  open on the tabl
22c0: 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d  e .** with root-
22d0: 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61  page iRoot. Usua
22e0: 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c  lly, this is cal
22f0: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
2300: 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70  cursor.** pExcep
2310: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
2320: 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28 42  ify the table (B
2330: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
2340: 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a  BtreeInsert())..
2350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
2360: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
2370: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
2380: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
2390: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
23a0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
23b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23c0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
23d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
23e0: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
23f0: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
2400: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2410: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2420: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2430: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
2440: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
2450: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
2460: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e   && .        p->
2470: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2480: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  ALID ){.      in
2490: 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f  t rc = saveCurso
24a0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
24b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
24c0: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20  K!=rc ){.       
24d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
24f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
2510: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2520: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
2530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
2540: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2550: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2560: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2570: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2580: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
2590: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
25a0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
25b0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
25c0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
25d0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
25e0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
25f0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
2600: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
2610: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
2620: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
2630: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2640: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
2650: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
2660: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
2670: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
2680: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
2690: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
26a0: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
26b0: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
26c0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
26d0: 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  e restoreOrClear
26e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
26f0: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
2700: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
2710: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a  osition()..**.**
2720: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
2730: 72 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e 74  rgument argument
2740: 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20 66   - doSeek - is f
2750: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
2760: 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72 6e  ad of .** return
2770: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2780: 6f 20 69 74 27 73 20 73 61 76 65 64 20 70 6f 73  o it's saved pos
2790: 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64  ition, any saved
27a0: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c   position is del
27b0: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  eted.** and the 
27c0: 63 75 72 73 6f 72 20 73 74 61 74 65 20 73 65 74  cursor state set
27d0: 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c   to CURSOR_INVAL
27e0: 49 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ID..*/.int sqlit
27f0: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f 72  e3BtreeRestoreOr
2800: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2810: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2820: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2830: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2840: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2860: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2870: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2880: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2890: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
28a0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
28b0: 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
28c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28d0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
28e0: 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
28f0: 6c 6f 62 48 61 6e 64 6c 65 20 29 7b 0a 20 20 20  lobHandle ){.   
2900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
2910: 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
2920: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
2930: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2940: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2950: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
2960: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
2970: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
2980: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
2990: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
29b0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
29c0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
29d0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
29e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29f0: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2a00: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a10: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
2a20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a30: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
2a40: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
2a50: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
2a60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2a70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
2a80: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
2a90: 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f 72 43  3BtreeRestoreOrC
2aa0: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2ab0: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
2ac0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 23     SQLITE_OK)..#
2ad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ae0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
2af0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
2b00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
2b10: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
2b20: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
2b30: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
2b40: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
2b50: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
2b60: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
2b70: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
2b80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
2b90: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
2ba0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
2bb0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
2bc0: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
2bd0: 50 65 72 4d 61 70 50 61 67 65 2c 20 69 50 74 72  PerMapPage, iPtr
2be0: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
2bf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c00: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2c10: 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65  x) );.  nPagesPe
2c20: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
2c30: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
2c40: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
2c50: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
2c60: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
2c70: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
2c80: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
2c90: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
2ca0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2cb0: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
2cc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2cd0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
2ce0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
2cf0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2d00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2d10: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
2d20: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2d30: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
2d40: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
2d50: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
2d60: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
2d70: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
2d80: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e  er 'pgno'..** An
2d90: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2da0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
2db0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
2dc0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
2dd0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
2de0: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74  int ptrmapPut(Bt
2df0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2e00: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
2e10: 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20   Pgno parent){. 
2e20: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
2e30: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
2e40: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
2e50: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
2e60: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
2e70: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
2e80: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
2e90: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
2ea0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
2eb0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
2ec0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2ed0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
2ee0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2ef0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2f00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2f10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2f20: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
2f30: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
2f40: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
2f50: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
2f60: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
2f70: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
2f80: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
2f90: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2fa0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
2fb0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2fc0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
2fd0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
2fe0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ff0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
3000: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
3010: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
3020: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
3030: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
3040: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
3050: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
3060: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3070: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
3080: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
3090: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70  RMAP_PTROFFSET(p
30a0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72  Bt, key);.  pPtr
30b0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
30c0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
30d0: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
30e0: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
30f0: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
3100: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
3110: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
3120: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
3130: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
3140: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
3150: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
3160: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
3170: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
3180: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
3190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31a0: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
31b0: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
31c0: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
31d0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
31e0: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
31f0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
3200: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
3210: 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
3220: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
3230: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
3240: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
3250: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3260: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
3270: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
3280: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
3290: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
32a0: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
32b0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
32c0: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
32d0: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
32e0: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
32f0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
3300: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
3310: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
3320: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
3330: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
3340: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
3350: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
3360: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
3370: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
3380: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
3390: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
33a0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
33b0: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
33c0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
33d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
33e0: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
33f0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
3400: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
3410: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
3420: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
3430: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
3440: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
3450: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3460: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3470: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
3480: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
3490: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
34a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
34b0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
34c0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
34d0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34e0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
34f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
3500: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
3510: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
3520: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
3530: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
3540: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65  TROFFSET(pBt, ke
3550: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
3560: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
3570: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
3580: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
3590: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
35a0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
35b0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
35c0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35d0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
35e0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
35f0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
3600: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
3610: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
3620: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
3630: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3640: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
3650: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
3660: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
3670: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
3680: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
3690: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
36a0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
36b0: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
36c0: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
36d0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
36e0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
36f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
3700: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
3710: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
3720: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
3730: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
3740: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
3750: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
3760: 6c 29 20 5c 0a 20 20 28 28 70 50 61 67 65 29 2d  l) \.  ((pPage)-
3770: 3e 61 44 61 74 61 20 2b 20 67 65 74 32 62 79 74  >aData + get2byt
3780: 65 28 26 28 70 50 61 67 65 29 2d 3e 61 44 61 74  e(&(pPage)->aDat
3790: 61 5b 28 70 50 61 67 65 29 2d 3e 63 65 6c 6c 4f  a[(pPage)->cellO
37a0: 66 66 73 65 74 2b 32 2a 28 69 43 65 6c 6c 29 5d  ffset+2*(iCell)]
37b0: 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  )).#ifdef SQLITE
37c0: 5f 54 45 53 54 0a 75 38 20 2a 73 71 6c 69 74 65  _TEST.u8 *sqlite
37d0: 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c 28 4d  3BtreeFindCell(M
37e0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
37f0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61 73 73  nt iCell){.  ass
3800: 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b  ert( iCell>=0 );
3810: 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c  .  assert( iCell
3820: 3c 67 65 74 32 62 79 74 65 28 26 70 50 61 67 65  <get2byte(&pPage
3830: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
3840: 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b 0a  drOffset+3]) );.
3850: 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c    return findCel
3860: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
3870: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3880: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
3890: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
38a0: 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64  sqlite3BtreeFind
38b0: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
38c0: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
38d0: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
38e0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20  verflow cells.  
38f0: 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74  See insert.*/.st
3900: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65  atic u8 *findOve
3910: 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67  rflowCell(MemPag
3920: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
3930: 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ell){.  int i;. 
3940: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3950: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
3960: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
3970: 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d  ;.  for(i=pPage-
3980: 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e  >nOverflow-1; i>
3990: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
39a0: 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t k;.    struct 
39b0: 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c  _OvflCell *pOvfl
39c0: 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70  ;.    pOvfl = &p
39d0: 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a  Page->aOvfl[i];.
39e0: 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69      k = pOvfl->i
39f0: 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69  dx;.    if( k<=i
3a00: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
3a10: 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k==iCell ){.  
3a20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76        return pOv
3a30: 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  fl->pCell;.     
3a40: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
3a50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3a60: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
3a70: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
3a80: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
3a90: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
3aa0: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
3ab0: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
3ac0: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
3ad0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
3ae0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
3af0: 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
3b00: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
3b10: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
3b20: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
3b30: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c  argument and sql
3b40: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3b50: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
3b60: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3b70: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
3b80: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
3b90: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
3ba0: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
3bb0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
3bc0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
3bd0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
3be0: 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  of.** sqlite3Btr
3bf0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
3c00: 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d  . Using some com
3c10: 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c  pilers, this wil
3c20: 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  l be faster..*/.
3c30: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
3c40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
3c50: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
3c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3c70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
3c80: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
3c90: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
3ca0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3cb0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
3cc0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
3cd0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
3ce0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
3cf0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cture */.){.  in
3d00: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
3d10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3d20: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
3d30: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
3d40: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
3d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3d60: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
3d70: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
3d80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3d90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
3da0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
3db0: 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43   );..  pInfo->pC
3dc0: 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61  ell = pCell;.  a
3dd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
3de0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
3df0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d  leaf==1 );.  n =
3e00: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
3e10: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
3e20: 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65  n==4-4*pPage->le
3e30: 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  af );.  if( pPag
3e40: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
3e50: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
3e60: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e  32(&pCell[n], &n
3e70: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73  Payload);.  }els
3e80: 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  e{.    nPayload 
3e90: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  = 0;.  }.  pInfo
3ea0: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
3eb0: 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ad;.  if( pPage-
3ec0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
3ed0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
3ee0: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29  Cell[n], (u64 *)
3ef0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
3f00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32 20   }else{.    u32 
3f10: 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  x;.    n += getV
3f20: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
3f30: 5d 2c 20 26 78 29 3b 0a 20 20 20 20 70 49 6e 66  ], &x);.    pInf
3f40: 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20  o->nKey = x;.   
3f50: 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a   nPayload += x;.
3f60: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
3f70: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
3f80: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
3f90: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
3fa0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
3fb0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
3fc0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
3fd0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
3fe0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
3ff0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
4000: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
4010: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
4020: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4030: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4040: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
4050: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
4060: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
4070: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
4080: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
4090: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
40a0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
40b0: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
40c0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
40d0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
40e0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
40f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
4100: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
4110: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
4120: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
4130: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4140: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
4150: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
4160: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
4170: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
4180: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
4190: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
41a0: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
41b0: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
41c0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
41d0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
41e0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
41f0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
4200: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
4210: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4220: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4230: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4240: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
4250: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
4260: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
4270: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
4280: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
4290: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
42a0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
42b0: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
42c0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
42d0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
42e0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
42f0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
4300: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
4310: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4320: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4330: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4340: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4350: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
4360: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
4370: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4380: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4390: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
43a0: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
43b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
43c0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
43d0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
43e0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
43f0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
4400: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
4410: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4420: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4430: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4440: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
4450: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
4460: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
4470: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
4480: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
4490: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
44a0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
44b0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
44c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
44d0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
44e0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
44f0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
4500: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
4510: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
4520: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
4530: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
4540: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4550: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
4560: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4570: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
4580: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
4590: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
45a0: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
45b0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
45c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
45d0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
45e0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
45f0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
4600: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
4610: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
4620: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
4630: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
4640: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
4650: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
4660: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
4670: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  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 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
46a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
46b0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
46c0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
46d0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
46e0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
46f0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
4700: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
4710: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
4720: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
4730: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
4740: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
4750: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
4760: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
4770: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
4780: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
4790: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
47a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c  .static int cell
47b0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
47c0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
47d0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
47e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
47f0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
4800: 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   iCell, &info);.
4810: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4820: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74  ize;.}.#endif.st
4830: 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a  atic int cellSiz
4840: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
4850: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4860: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4870: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4880: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4890: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
48a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
48b0: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
48c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
48d0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
48e0: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
48f0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
4900: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
4910: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4920: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4930: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4940: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4950: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4960: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4980: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
4990: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
49a0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28  8 *pCell){.  if(
49b0: 20 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65   pCell ){.    Ce
49c0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
49d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
49e0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
49f0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4a00: 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
4a10: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4a20: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4a30: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4a40: 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28  oad );.    if( (
4a50: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
4a60: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
4a70: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
4a80: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  cal ){.      Pgn
4a90: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
4aa0: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
4ab0: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
4ac0: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
4ad0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
4ae0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
4af0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
4b00: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
4b10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4b20: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ;.}./*.** If the
4b30: 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78   cell with index
4b40: 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70   iCell on page p
4b50: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4b60: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4b70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4b80: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4b90: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4ba0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4bb0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4bd0: 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61  mapPutOvfl(MemPa
4be0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
4bf0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65  Cell){.  u8 *pCe
4c00: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ll;.  assert( sq
4c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4c20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
4c30: 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d  ex) );.  pCell =
4c40: 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
4c50: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
4c60: 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70  .  return ptrmap
4c70: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
4c80: 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , pCell);.}.#end
4c90: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
4ca0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
4cb0: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
4cc0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
4cd0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
4ce0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
4cf0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
4d00: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
4d10: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
4d20: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
4d30: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
4d40: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
4d50: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
4d60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
4d70: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
4d80: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
4d90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
4da0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4dc0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4dd0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4df0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
4e00: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
4e10: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
4e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4e30: 65 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65  et of first byte
4e40: 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e   after cell poin
4e50: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
4e60: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
4e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
4e80: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
4e90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
4ea0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
4eb0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4ec0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
4ed0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
4ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4ef0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
4f00: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
4f10: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
4f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4f30: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
4f40: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
4f50: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20   */.  int brk;  
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
4f80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
4f90: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
4fa0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
4fb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4fc0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
4fd0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
4fe0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
4ff0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
5000: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
5010: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
5020: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
5030: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
5040: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
5050: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5060: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5070: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5080: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5090: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
50a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
50b0: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
50c0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
50d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
50e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
50f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5100: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5110: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5120: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
5130: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
5140: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
5150: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d  ize );.  if( tem
5160: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
5170: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61  LITE_NOMEM;.  da
5180: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
5190: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
51a0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
51b0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
51c0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
51d0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
51e0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
51f0: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
5200: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
5210: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
5220: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
5230: 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d  bleSize;.  brk =
5240: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5250: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
5260: 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64  y(&temp[brk], &d
5270: 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
5280: 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62  Size - brk);.  b
5290: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
52a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
52b0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
52c0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
52d0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
52e0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
52f0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
5300: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
5310: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
5320: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73  (pAddr);.    ass
5330: 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70  ert( pc<pPage->p
5340: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
5350: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
5360: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
5370: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
5380: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
5390: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72   memcpy(&data[br
53a0: 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73  k], &temp[pc], s
53b0: 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ize);.    put2by
53c0: 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a  te(pAddr, brk);.
53d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72    }.  assert( br
53e0: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
53f0: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
5400: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5410: 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68  , brk);.  data[h
5420: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
5430: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
5440: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
5450: 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66  .  addr = cellOf
5460: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20  fset+2*nCell;.  
5470: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64  memset(&data[add
5480: 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29  r], 0, brk-addr)
5490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
54a0: 28 74 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e  (temp);.  return
54b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
54c0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
54d0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
54e0: 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a  ce on a page..**
54f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
5500: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
5510: 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  >aData[] of the 
5520: 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a  first byte of.**
5530: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
5540: 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20 30  ion. Or return 0
5550: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   if there is not
5560: 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20   enough free.** 
5570: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
5580: 65 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  e to satisfy the
5590: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75   allocation requ
55a0: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  est..**.** If th
55b0: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  e page contains 
55c0: 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73  nBytes of free s
55d0: 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f  pace but does no
55e0: 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79  t contain.** nBy
55f0: 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75  tes of contiguou
5600: 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68  s free space, th
5610: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5620: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a  automatically.**
5630: 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65   calls defrageme
5640: 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73  ntPage() to cons
5650: 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65  olidate all free
5660: 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a   space before .*
5670: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  * allocating the
5680: 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73   new chunk..*/.s
5690: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
56a0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
56b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
56c0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
56d0: 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73  pc, hdr;.  int s
56e0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67  ize;.  int nFrag
56f0: 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69  ;.  int top;.  i
5700: 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
5710: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e  cellOffset;.  un
5720: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5730: 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70  a;.  .  data = p
5740: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61  Page->aData;.  a
5750: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
5760: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
5770: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
5780: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5790: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
57a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
57b0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
57c0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
57d0: 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79  f( nByte<4 ) nBy
57e0: 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50  te = 4;.  if( pP
57f0: 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65  age->nFree<nByte
5800: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
5810: 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20  flow>0 ) return 
5820: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  0;.  pPage->nFre
5830: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64  e -= nByte;.  hd
5840: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
5850: 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  fset;..  nFrag =
5860: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
5870: 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a  if( nFrag<60 ){.
5880: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
5890: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
58a0: 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69  ng for a slot bi
58b0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
58c0: 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  sfy the.    ** s
58d0: 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f  pace request. */
58e0: 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b  .    addr = hdr+
58f0: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  1;.    while( (p
5900: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
5910: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
5920: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
5930: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
5940: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
5950: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
5960: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42       if( size<nB
5970: 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  yte+4 ){.       
5980: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5990: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
59a0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
59b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46  data[hdr+7] = nF
59c0: 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79  rag + size - nBy
59d0: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  te;.          re
59e0: 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20  turn pc;.       
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5a00: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5a10: 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79  [pc+2], size-nBy
5a20: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  te);.          r
5a30: 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20  eturn pc + size 
5a40: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
5a50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5a60: 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20   addr = pc;.    
5a70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
5a80: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
5a90: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
5aa0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
5ab0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
5ac0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
5ad0: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
5ae0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
5af0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5b00: 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
5b10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
5b20: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
5b30: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
5b40: 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  et;.  if( nFrag>
5b50: 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65  =60 || cellOffse
5b60: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f  t + 2*nCell > to
5b70: 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  p - nByte ){.   
5b80: 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50   if( defragmentP
5b90: 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65 74  age(pPage) ) ret
5ba0: 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d  urn 0;.    top =
5bb0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5bc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5bd0: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5be0: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5bf0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5c00: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5c10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5c20: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5c30: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
5c40: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
5c50: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
5c60: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
5c70: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
5c80: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
5c90: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5ca0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5cb0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5cc0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5cd0: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5ce0: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5cf0: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5d00: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5d10: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5d20: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5d30: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
5d40: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
5d50: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
5d60: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
5d70: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
5d80: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
5d90: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
5da0: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
5db0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
5dc0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
5dd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5de0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5df0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5e00: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5e10: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5e20: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
5e30: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
5e40: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
5e50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
5e60: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
5e70: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5e80: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
5e90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5ea0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5eb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
5ec0: 20 73 69 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d   size<4 ) size =
5ed0: 20 34 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   4;..#ifdef SQLI
5ee0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
5ef0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
5f00: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
5f10: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
5f20: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
5f30: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
5f40: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
5f50: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
5f60: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
5f70: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
5f80: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
5f90: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
5fa0: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
5fb0: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
5fc0: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
5fd0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
5fe0: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
5ff0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
6000: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
6010: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
6020: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
6030: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6040: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6050: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6060: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6070: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
6080: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6090: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
60a0: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
60b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
60c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 62 65  );.  assert( pbe
60d0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
60e0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
60f0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
6100: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
6110: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
6120: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
6130: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
6140: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
6150: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73  Page->nFree += s
6160: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
6170: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
6180: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
6190: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
61a0: 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69  ffset + 1;.  whi
61b0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
61c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
61d0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
61e0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a  t pnext, psize;.
61f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6200: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
6210: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6220: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6230: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
6240: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
6250: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
6260: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
6270: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6280: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
6290: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
62a0: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
62b0: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
62c0: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
62d0: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
62e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
62f0: 66 72 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65  frag<=data[pPage
6300: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29  ->hdrOffset+7] )
6310: 3b 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  ;.      data[pPa
6320: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
6330: 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20   -= frag;.      
6340: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6350: 62 65 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65  begin], get2byte
6360: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b  (&data[pnext]));
6370: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
6380: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
6390: 20 70 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28   pnext+get2byte(
63a0: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d  &data[pnext+2])-
63b0: 70 62 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c  pbegin);.    }el
63c0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
63d0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
63e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
63f0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
6400: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
6410: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
6420: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
6430: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
6440: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
6450: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
6460: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
6470: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
6480: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6490: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
64a0: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
64b0: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
64c0: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
64d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
64e0: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  r+5]);.    put2b
64f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
6500: 2c 20 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65  , top + get2byte
6510: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
6520: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
6530: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
6540: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
6550: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
6560: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
6570: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
6580: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
6590: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
65a0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
65b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
65c0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
65d0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
65e0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
65f0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
6600: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
6610: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
6620: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
6630: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
6640: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
6650: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6660: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6670: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6680: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
6690: 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c 61 67 42  >intKey = (flagB
66a0: 79 74 65 20 26 20 28 50 54 46 5f 49 4e 54 4b 45  yte & (PTF_INTKE
66b0: 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29  Y|PTF_LEAFDATA))
66c0: 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65  !=0;.  pPage->ze
66d0: 72 6f 44 61 74 61 20 3d 20 28 66 6c 61 67 42 79  roData = (flagBy
66e0: 74 65 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54  te & PTF_ZERODAT
66f0: 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  A)!=0;.  pPage->
6700: 6c 65 61 66 20 3d 20 28 66 6c 61 67 42 79 74 65  leaf = (flagByte
6710: 20 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b   & PTF_LEAF)!=0;
6720: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
6730: 74 72 53 69 7a 65 20 3d 20 34 2a 28 70 50 61 67  trSize = 4*(pPag
6740: 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70  e->leaf==0);.  p
6750: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
6760: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 20  .  if( flagByte 
6770: 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  & PTF_LEAFDATA )
6780: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61  {.    pPage->lea
6790: 66 44 61 74 61 20 3d 20 31 3b 0a 20 20 20 20 70  fData = 1;.    p
67a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
67b0: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
67c0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
67d0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
67e0: 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
67f0: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
6800: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
6810: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
6820: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
6830: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
6840: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
6850: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68 61 73 44   }.  pPage->hasD
6860: 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a  ata = !(pPage->z
6870: 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70 50 61  eroData || (!pPa
6880: 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50 61 67  ge->leaf && pPag
6890: 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d  e->leafData));.}
68a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
68b0: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
68c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
68d0: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
68e0: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
68f0: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
6900: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
6910: 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63  the MemPage whic
6920: 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65  h.** is the pare
6930: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 62  nt of the page b
6940: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
6950: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  .  The root of a
6960: 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f  .** BTree has no
6970: 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66   parent and so f
6980: 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20 70 50  or that page, pP
6990: 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a  arent==NULL..**.
69a0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
69b0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
69c0: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
69d0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
69e0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
69f0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6a00: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
6a10: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
6a20: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
6a30: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
6a40: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
6a50: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
6a60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6a70: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
6a80: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
6a90: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
6aa0: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
6ab0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
6ad0: 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
6ae0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
6af0: 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
6b00: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
6b10: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
6b20: 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ent       /* The
6b30: 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20   parent.  Might 
6b40: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6b50: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6b60: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6b70: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
6b80: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
6b90: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  [] */.  int hdr;
6ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6bb0: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
6bc0: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
6bd0: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
6be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
6bf0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
6c00: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
6c10: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
6c20: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
6c30: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
6c40: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
6c50: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
6c60: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
6c70: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ch page */.  int
6c80: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
6c90: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
6ca0: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
6cb0: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
6cc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
6cd0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
6ce0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
6cf0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
6d00: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
6d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
6d20: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
6d30: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
6d40: 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  */..  pBt = pPag
6d50: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
6d60: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ( pBt!=0 );.  as
6d70: 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30  sert( pParent==0
6d80: 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74   || pParent->pBt
6d90: 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ==pBt );.  asser
6da0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6db0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6dc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6dd0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
6de0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
6df0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
6e00: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
6e10: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
6e20: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
6e30: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
6e40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
6e50: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
6e60: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6e70: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6e80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
6e90: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
6ea0: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
6eb0: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
6ec0: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
6ed0: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
6ee0: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
6ef0: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
6f00: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
6f10: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
6f20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6f30: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
6f40: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65  age->isInit ) re
6f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6f60: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
6f70: 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65  rent==0 && pPare
6f80: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
6f90: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
6fa0: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
6fb0: 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
6fc0: 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
6fd0: 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
6fe0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
6ff0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7000: 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  a;.  decodeFlags
7010: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
7020: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ]);.  pPage->nOv
7030: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
7040: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
7050: 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
7060: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7070: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
7080: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
7090: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
70a0: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
70b0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
70c0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
70d0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
70e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
70f0: 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70  hdr+3]);.  if( p
7100: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
7110: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
7120: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
7130: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
7140: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
7150: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
7160: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7170: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7180: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7190: 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
71a0: 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72  arent!=0 && pPar
71b0: 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  ent->pgno!=1 ){.
71c0: 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73      /* All pages
71d0: 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65   must have at le
71e0: 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78  ast one cell, ex
71f0: 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61  cept for root pa
7200: 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ges */.    retur
7210: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7220: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
7230: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
7240: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
7250: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
7260: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
7270: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
7280: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
7290: 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f  ] + top - (cellO
72a0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
72b0: 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65  >nCell);.  while
72c0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ( pc>0 ){.    in
72d0: 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  t next, size;.  
72e0: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
72f0: 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f  ize-4 ){.      /
7300: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  * Free block is 
7310: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
7320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7330: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7340: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78  ; .    }.    nex
7350: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
7360: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a  ta[pc]);.    siz
7370: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7380: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
7390: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
73a0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
73b0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
73c0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
73d0: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
73e0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
73f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7400: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
7410: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20  nFree += size;. 
7420: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
7430: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
7440: 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20   = nFree;.  if( 
7450: 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a  nFree>=usableSiz
7460: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65  e ){.    /* Free
7470: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
7480: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
7490: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  size */.    retu
74a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
74b0: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20  T_BKPT; .  }..  
74c0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
74d0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
74e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
74f0: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
7500: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
7510: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
7520: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
7530: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
7540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
7550: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
7560: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
7570: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
7580: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
7590: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
75a0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
75b0: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72  ->pBt;.  int hdr
75c0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
75d0: 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74  set;.  int first
75e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
75f0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
7600: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
7610: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
7620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7630: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
7640: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
7650: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
7660: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
7670: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
7680: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
7690: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
76a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
76b0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
76c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
76d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
76e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
76f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7700: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
7710: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
7720: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
7730: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c    data[hdr] = fl
7740: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
7750: 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61  dr + 8 + 4*((fla
7760: 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29  gs&PTF_LEAF)==0)
7770: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
7780: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
7790: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
77a0: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
77b0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
77c0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
77d0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
77e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
77f0: 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65   first;.  decode
7800: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
7810: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
7820: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
7830: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
7840: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
7850: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
7860: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
7870: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50 61  Shift = 0;.  pPa
7880: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
7890: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
78a0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   1;.}../*.** Get
78b0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
78c0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
78d0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
78e0: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
78f0: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
7900: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
7910: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
7920: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
7930: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
7940: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
7950: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
7960: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
7970: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
7980: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
7990: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
79a0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
79b0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
79c0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
79d0: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
79e0: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
79f0: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
7a00: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
7a10: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
7a20: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
7a30: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
7a40: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
7a50: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
7a60: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
7a70: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
7a80: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
7a90: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
7aa0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
7ab0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
7ac0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
7ad0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
7ae0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7af0: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
7b00: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
7b10: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
7b20: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
7b30: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
7b40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
7b50: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
7b60: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
7b70: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
7b80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
7b90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
7ba0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7bb0: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
7bc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7bd0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7be0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7bf0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
7c00: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
7c10: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
7c20: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
7c30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7c40: 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28   rc;.  pPage = (
7c50: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
7c60: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
7c70: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
7c80: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
7c90: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7ca0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
7cb0: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
7cc0: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
7cd0: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
7ce0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
7cf0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7d00: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
7d10: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a  1 ? 100 : 0;.  *
7d20: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
7d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7d40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
7d50: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
7d60: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
7d70: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
7d80: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
7d90: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
7da0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
7db0: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
7dc0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
7dd0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
7de0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
7df0: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
7e00: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
7e10: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
7e20: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
7e30: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
7e40: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
7e50: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
7e60: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
7e70: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
7e80: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
7e90: 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ,    /* Write th
7ea0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
7eb0: 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ere */.  MemPage
7ec0: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f 2a   *pParent     /*
7ed0: 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70   Parent of the p
7ee0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
7ef0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
7f00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7f10: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7f20: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
7f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7f40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7f50: 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c   .  }.  rc = sql
7f60: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7f70: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
7f80: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
7f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
7fa0: 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
7fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
7fc0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
7fd0: 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70 50  Page(*ppPage, pP
7fe0: 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65  arent);.  }.  re
7ff0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8000: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
8010: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
8020: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
8030: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
8040: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
8050: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a  e3BtreeGetPage..
8060: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
8070: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
8080: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
8090: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
80a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
80b0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
80c0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
80d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
80e0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
80f0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8100: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
8110: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
8120: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8130: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
8140: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
8150: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
8160: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8170: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8180: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
8190: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
81a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
81b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
81c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
81d0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
81e0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
81f0: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61  or a page.** rea
8200: 63 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e  ches zero.  We n
8210: 65 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65  eed to unref the
8220: 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
8230: 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61   when that.** ha
8240: 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ppens..*/.static
8250: 20 76 6f 69 64 20 70 61 67 65 44 65 73 74 72 75   void pageDestru
8260: 63 74 6f 72 28 44 62 50 61 67 65 20 2a 70 44 61  ctor(DbPage *pDa
8270: 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  ta, int pageSize
8280: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
8290: 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28  age;.  assert( (
82a0: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
82b0: 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d   );.  pPage = (M
82c0: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
82d0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
82e0: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
82f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30  pPage->isInit==0
8300: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
8310: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8320: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8330: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
8340: 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  t ){.    MemPage
8350: 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67   *pParent = pPag
8360: 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  e->pParent;.    
8370: 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
8380: 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e 70 42 74  >pBt==pPage->pBt
8390: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70   );.    pPage->p
83a0: 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
83b0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
83c0: 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ent);.  }.  pPag
83d0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d  e->isInit = 0;.}
83e0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
83f0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
8400: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
8410: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
8420: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
8430: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
8440: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
8450: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
8460: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
8470: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
8480: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
8490: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
84a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
84b0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
84c0: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
84d0: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
84e0: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
84f0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
8500: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
8510: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
8520: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
8530: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
8540: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
8550: 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  ta, int pageSize
8560: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
8570: 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28  age;.  assert( (
8580: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
8590: 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d   );.  pPage = (M
85a0: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
85b0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
85c0: 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ata);.  if( pPag
85d0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
85e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
85f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8600: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8610: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
8620: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nit = 0;.    sql
8630: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8640: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
8650: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
8660: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
8670: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
8680: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
8690: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
86a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
86b0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
86c0: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
86d0: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
86e0: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
86f0: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
8700: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
8710: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
8720: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
8730: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
8740: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
8750: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
8760: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
8770: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
8780: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
8790: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
87a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
87b0: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
87c0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
87d0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
87e0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
87f0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
8800: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
8810: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8820: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
8830: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53  */.  sqlite3 *pS
8840: 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  qlite,       /* 
8850: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
8860: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
8870: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
8880: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
8890: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
88a0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
88b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
88c0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
88d0: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
88e0: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
88f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
8900: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
8910: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
8920: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
8930: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
8940: 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  s;      /* The V
8950: 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
8960: 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74  is btree */.  Bt
8970: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
8980: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
8990: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
89a0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
89b0: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
89c0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
89d0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
89e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
89f0: 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ;.  int nReserve
8a00: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8a10: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
8a20: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
8a30: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
8a40: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
8a50: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
8a60: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
8a70: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
8a80: 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68  sed database. Th
8a90: 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c  is symbol is onl
8aa0: 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20  y required if.  
8ab0: 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ** either of the
8ac0: 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20   shared-data or 
8ad0: 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75  autovacuum featu
8ae0: 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64  res are compiled
8af0: 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20   .  ** into the 
8b00: 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69  library..  */.#i
8b10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8b20: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
8b30: 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  CHE) || !defined
8b40: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54  (SQLITE_OMIT_AUT
8b50: 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65  OVACUUM).  #ifde
8b60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8b70: 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74  MORYDB.    const
8b80: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
8b90: 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f  ;.  #else.    co
8ba0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
8bb0: 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  = zFilename && !
8bc0: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
8bd0: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20  , ":memory:");. 
8be0: 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a   #endif.#endif..
8bf0: 20 20 61 73 73 65 72 74 28 20 70 53 71 6c 69 74    assert( pSqlit
8c00: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
8c10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8c20: 68 65 6c 64 28 70 53 71 6c 69 74 65 2d 3e 6d 75  held(pSqlite->mu
8c30: 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20  tex) );..  pVfs 
8c40: 3d 20 70 53 71 6c 69 74 65 2d 3e 70 56 66 73 3b  = pSqlite->pVfs;
8c50: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
8c60: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
8c70: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
8c80: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8c90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8ca0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
8cb0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
8cc0: 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c  ->pSqlite = pSql
8cd0: 69 74 65 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  ite;..#if !defin
8ce0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8cf0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8d00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8d10: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
8d20: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
8d30: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
8d40: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
8d50: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
8d60: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
8d70: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
8d80: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
8d90: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
8da0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42 54   if( (flags & BT
8db0: 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30 0a  REE_PRIVATE)==0.
8dc0: 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d 30     && isMemdb==0
8dd0: 0a 20 20 20 26 26 20 28 70 53 71 6c 69 74 65 2d  .   && (pSqlite-
8de0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8df0: 56 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a  Vtab)==0.   && z
8e00: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
8e10: 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20  ename[0].  ){.  
8e20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61    if( sqlite3Sha
8e30: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
8e40: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
8e50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 28  FullPathname = (
8e60: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
8e70: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50 61  alloc(pVfs->mxPa
8e80: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  thname);.      s
8e90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
8ea0: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
8eb0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
8ec0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 71 6c  ;.      if( pSql
8ed0: 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ite ){.        p
8ee0: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 20 7c 3d  Sqlite->flags |=
8ef0: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
8f00: 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  che;.      }.   
8f10: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
8f20: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
8f30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
8f40: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8f50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8f70: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
8f80: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
8f90: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
8fa0: 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  e);.      mutexS
8fb0: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  hared = sqlite3_
8fc0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
8fd0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
8fe0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
8ff0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9000: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
9010: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73  .      for(pBt=s
9020: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
9030: 65 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d  eList; pBt; pBt=
9040: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
9050: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
9060: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
9070: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
9080: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
9090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
90a0: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
90b0: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
90c0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
90d0: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
90e0: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
90f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
9100: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
9110: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
9120: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9150: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
9160: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
9170: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
9180: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
9190: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
91a0: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
91b0: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
91c0: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
91d0: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
91e0: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
91f0: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
9200: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
9210: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
9220: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
9230: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
9240: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
9250: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
9260: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
9270: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
9280: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
9290: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
92a0: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
92b0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
92c0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
92d0: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
92e0: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
92f0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9300: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
9310: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
9320: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
9330: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
9340: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
9350: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
9360: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
9370: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
9380: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
9390: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
93a0: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
93b0: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
93c0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
93d0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
93e0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
93f0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9400: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
9410: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
9420: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9430: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
9440: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
9450: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
9460: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
9470: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
9480: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
9490: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
94a0: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
94b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
94c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
94d0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
94e0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
94f0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9500: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9510: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
9520: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
9530: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
9560: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29  flags, vfsFlags)
9570: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9580: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
95a0: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
95b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
95c0: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
95d0: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
95e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
95f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9600: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
9610: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
9620: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
9630: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9640: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42  SetDestructor(pB
9650: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44  t->pPager, pageD
9660: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
9670: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
9680: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
9690: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
96a0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  ;.    pBt->pCurs
96b0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
96c0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
96d0: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
96e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
96f0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
9700: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
9710: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
9720: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
9730: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
9740: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
9750: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
9760: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
9770: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
9780: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
9790: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
97a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
97b0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
97c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
97d0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
97e0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
97f0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9800: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
9810: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
9820: 32 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74  25% */.      pBt
9830: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
9840: 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20   32;   /* 12.5% 
9850: 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  */.      pBt->mi
9860: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
9870: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
9880: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9890: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
98a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
98b0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
98c0: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
98d0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
98e0: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
98f0: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
9900: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
9910: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
9920: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
9930: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
9940: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9950: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
9960: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
9970: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
9980: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9990: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
99a0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
99b0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
99c0: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
99d0: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
99e0: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
99f0: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
9a00: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
9a10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9a20: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
9a30: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
9a40: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
9a50: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
9a60: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
9a70: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
9a80: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
9a90: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9aa0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
9ab0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
9ac0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
9ad0: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
9ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
9af0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
9b00: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
9b10: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
9b20: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
9b30: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9b40: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
9b50: 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20  eader[22];.     
9b60: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9b70: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
9b80: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
9b90: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
9ba0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9bb0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
9bc0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
9bd0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
9be0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
9bf0: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
9c00: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
9c10: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
9c20: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
9c30: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
9c40: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
9c50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
9c60: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
9c70: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
9c80: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
9c90: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
9ca0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
9cb0: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
9cc0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
9cd0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9ce0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9cf0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9d00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9d10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9d20: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9d30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9d40: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
9d50: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
9d60: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
9d70: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
9d80: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
9d90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9da0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
9db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9dc0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
9dd0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
9de0: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
9df0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
9e00: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
9e10: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
9e20: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
9e30: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
9e40: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
9e50: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
9e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
9e70: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9e80: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
9e90: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
9ea0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
9eb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 71 6c  ;.          pSql
9ed0: 69 74 65 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  ite->mallocFaile
9ee0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
9ef0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
9f00: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
9f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9f20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9f30: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
9f40: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
9f50: 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64   = sqlite3Shared
9f60: 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20  CacheList;.     
9f70: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
9f80: 63 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20  cheList = pBt;. 
9f90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9fa0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
9fb0: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
9fc0: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
9fd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9fe0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9ff0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a000: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a010: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
a020: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
a030: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
a040: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
a050: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
a060: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
a070: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
a080: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
a090: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
a0a0: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
a0b0: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
a0c0: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
a0d0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
a0e0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
a0f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
a100: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
a110: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 71 6c 69 74  or(i=0; i<pSqlit
a120: 65 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  e->nDb; i++){.  
a130: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
a140: 70 53 71 6c 69 74 65 2d 3e 61 44 62 5b 69 5d 2e  pSqlite->aDb[i].
a150: 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
a160: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
a170: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
a180: 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
a190: 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
a1a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
a1b0: 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
a1c0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
a1d0: 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
a1e0: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
a1f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
a200: 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
a210: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a220: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
a230: 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
a240: 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
a250: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
a260: 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
a270: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
a280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
a290: 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
a2a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
a2b0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
a2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
a2d0: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
a2e0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
a2f0: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
a300: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a310: 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
a320: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
a330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a340: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
a350: 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
a360: 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
a370: 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
a380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a390: 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
a3a0: 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
a3b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
a3c0: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
a3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a3e0: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
a3f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a400: 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
a410: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a420: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a430: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
a440: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
a450: 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
a460: 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
a470: 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
a480: 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
a490: 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
a4a0: 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
a4b0: 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
a4c0: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
a4d0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
a4e0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
a4f0: 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
a500: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
a510: 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
a520: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
a530: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
a540: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a550: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
a560: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
a570: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68  *pMaster;.  BtSh
a580: 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
a590: 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
a5a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a5b0: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
a5c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
a5d0: 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    pMaster = sqli
a5e0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
a5f0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a600: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
a610: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a620: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
a630: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
a640: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
a650: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
a660: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
a670: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ==pBt ){.      s
a680: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
a690: 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65  eList = pBt->pNe
a6a0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
a6b0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
a6c0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
a6d0: 69 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ist;.      while
a6e0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
a6f0: 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
a700: 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
a710: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
a720: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
a730: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ist ){.        p
a740: 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
a750: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
a760: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
a770: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a780: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
a790: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
a7a0: 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
a7b0: 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
a7c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a7d0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a7e0: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a7f0: 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
a800: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
a810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
a820: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
a830: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
a840: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
a850: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
a860: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
a870: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
a880: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
a890: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
a8a0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
a8b0: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
a8c0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
a8d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a8e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
a8f0: 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29  >pSqlite->mutex)
a900: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
a910: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
a920: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
a930: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
a940: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
a950: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
a960: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
a970: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
a980: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
a990: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
a9a0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
a9b0: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
a9c0: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
a9d0: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
a9e0: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
a9f0: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
aa00: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
aa10: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
aa20: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
aa30: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
aa40: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
aa50: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
aa60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
aa70: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
aa80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
aa90: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
aaa0: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
aab0: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
aac0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
aad0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
aae0: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
aaf0: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
ab00: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
ab10: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
ab20: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
ab30: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
ab40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
ab50: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
ab60: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
ab70: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
ab80: 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
ab90: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
aba0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
abb0: 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
abc0: 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
abd0: 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
abe0: 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
abf0: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
ac00: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
ac10: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
ac20: 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
ac30: 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
ac40: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
ac50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
ac60: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
ac70: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
ac80: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
ac90: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
aca0: 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
acb0: 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
acc0: 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
acd0: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
ace0: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
acf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
ad00: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
ad10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
ad20: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
ad30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
ad40: 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
ad50: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
ad60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ad70: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
ad80: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
ad90: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
ada0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
adb0: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
adc0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
add0: 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
ade0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
adf0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
ae00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ae10: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73  * Change the bus
ae20: 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y handler callba
ae30: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ck function..*/.
ae40: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ae50: 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42  SetBusyHandler(B
ae60: 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e  tree *p, BusyHan
ae70: 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b  dler *pHandler){
ae80: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ae90: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
aea0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
aeb0: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69  ex_held(p->pSqli
aec0: 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
aed0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
aee0: 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 70 42 75  r(p);.  pBt->pBu
aef0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e  syHandler = pHan
af00: 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  dler;.  sqlite3P
af10: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
af20: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
af30: 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 73 71 6c  pHandler);.  sql
af40: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
af50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
af60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
af70: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
af80: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
af90: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
afa0: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
afb0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
afc0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
afd0: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
afe0: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
aff0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
b000: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
b010: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
b020: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
b030: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
b040: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
b050: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
b060: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
b070: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
b080: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
b090: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
b0a0: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
b0b0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
b0c0: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
b0d0: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
b0e0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
b0f0: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
b100: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
b110: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
b120: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
b130: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
b140: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
b150: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
b160: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
b170: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
b180: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
b190: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
b1a0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
b1b0: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
b1c0: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
b1d0: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
b1e0: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
b1f0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
b200: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
b210: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
b220: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b230: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
b240: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
b250: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
b260: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b270: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b280: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b290: 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
b2a0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
b2b0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
b2c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
b2d0: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
b2e0: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
b2f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
b300: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b310: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b320: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
b330: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
b340: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
b350: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
b360: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
b370: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
b380: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
b390: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
b3a0: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
b3b0: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
b3c0: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
b3d0: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
b3e0: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
b3f0: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
b400: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
b410: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
b420: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
b430: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
b440: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
b450: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
b460: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
b470: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
b480: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
b490: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
b4a0: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
b4b0: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
b4c0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
b4d0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
b4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
b4f0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
b500: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
b510: 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
b520: 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
b530: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
b540: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b550: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b560: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b570: 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
b580: 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  e->mutex) );.  s
b590: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b5a0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
b5b0: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
b5c0: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
b5d0: 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
b5e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b5f0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b600: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
b610: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b620: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
b630: 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
b640: 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
b650: 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
b660: 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
b670: 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
b680: 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
b690: 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
b6a0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b6b0: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
b6c0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
b6d0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b6e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
b6f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b700: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c  tex_held(p->pSql
b710: 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  ite->mutex) );  
b720: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
b730: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
b740: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
b750: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
b760: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
b770: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
b780: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b790: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b7a0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
b7b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b7c0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
b7d0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b7e0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
b7f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b800: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
b810: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
b820: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
b830: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
b840: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
b850: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
b860: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
b870: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
b880: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
b890: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
b8a0: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
b8b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
b8c0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
b8d0: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
b8e0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
b8f0: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
b900: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
b910: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
b920: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
b930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b940: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
b950: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
b960: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
b970: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
b980: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
b990: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
b9a0: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
b9b0: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
b9c0: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
b9d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
b9e0: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
b9f0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
ba00: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
ba10: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
ba20: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
ba30: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
ba40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ba50: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
ba60: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
ba70: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
ba80: 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
ba90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
baa0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
bab0: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
bac0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
bad0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
bae0: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
baf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bb00: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
bb10: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
bb20: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
bb30: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
bb40: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
bb50: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
bb60: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
bb70: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
bb80: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
bb90: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
bba0: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
bbb0: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
bbc0: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
bbd0: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
bbe0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
bbf0: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
bc00: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
bc10: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
bc20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
bc30: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
bc40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
bc50: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
bc60: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
bc70: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  geSize);.  }.  p
bc80: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
bc90: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
bca0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c   nReserve;.  sql
bcb0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bcc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bcd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
bce0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
bcf0: 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
bd00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
bd10: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
bd20: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
bd30: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
bd40: 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ize;.}.int sqlit
bd50: 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
bd60: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
bd70: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
bd80: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
bd90: 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
bda0: 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
bdb0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
bdc0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bdd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
bde0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
bdf0: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
be00: 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
be10: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
be20: 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
be30: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
be40: 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
be50: 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
be60: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
be70: 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
be80: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
be90: 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
bea0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
beb0: 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
bec0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
bed0: 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
bee0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bef0: 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
bf00: 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
bf10: 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
bf20: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
bf30: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
bf40: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
bf50: 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n n;.}.#endif /*
bf60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bf70: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
bf80: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
bf90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
bfa0: 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
bfb0: 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
bfc0: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
bfd0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bfe0: 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
bff0: 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
c000: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
c010: 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
c020: 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
c030: 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
c040: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
c050: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
c060: 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
c070: 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
c080: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
c090: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
c0a0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
c0b0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
c0c0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
c0d0: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
c0e0: 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
c0f0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
c100: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c110: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c120: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
c130: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c140: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
c150: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c160: 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74  .  int av = (aut
c170: 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20  oVacuum?1:0);.. 
c180: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c190: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
c1a0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
c1b0: 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f  && av!=pBt->auto
c1c0: 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
c1d0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
c1e0: 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
c1f0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
c200: 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c   = av;.  }.  sql
c210: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
c220: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c230: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
c240: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
c250: 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
c260: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
c270: 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
c280: 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
c290: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
c2a0: 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
c2b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c2c0: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
c2d0: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
c2e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c2f0: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
c300: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
c310: 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
c320: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
c330: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
c340: 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
c350: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
c360: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
c370: 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
c380: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
c390: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
c3a0: 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
c3b0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
c3c0: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
c3d0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c3e0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
c3f0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
c400: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
c410: 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
c420: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
c430: 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
c440: 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
c450: 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
c460: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
c470: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
c480: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
c490: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
c4a0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
c4b0: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
c4c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c4d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
c4e0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
c4f0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
c500: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
c510: 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
c520: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
c530: 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
c540: 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
c550: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
c560: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
c570: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65  {.  int rc, page
c580: 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Size;.  MemPage 
c590: 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
c5a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c5b0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c5c0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
c5d0: 3e 70 50 61 67 65 31 20 29 20 72 65 74 75 72 6e  >pPage1 ) return
c5e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63   SQLITE_OK;.  rc
c5f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
c600: 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
c610: 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
c620: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c630: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
c640: 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
c650: 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
c660: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
c670: 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
c680: 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
c690: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
c6a0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c 49    */.  rc = SQLI
c6b0: 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66 28  TE_NOTADB;.  if(
c6c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
c6d0: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
c6e0: 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75 38 20  er)>0 ){.    u8 
c6f0: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
c700: 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  >aData;.    if( 
c710: 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
c720: 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
c730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c740: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c750: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
c760: 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
c770: 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
c780: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
c790: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
c7a0: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
c7b0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
c7c0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
c7d0: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
c7e0: 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
c7f0: 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
c800: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
c810: 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
c820: 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
c830: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
c840: 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
c850: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
c860: 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
c870: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
c880: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
c890: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
c8a0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
c8b0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
c8c0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
c8d0: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
c8e0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
c8f0: 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
c900: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 75  ;.    if( pBt->u
c910: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
c920: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
c930: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
c940: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61     }.    pBt->ma
c950: 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  xEmbedFrac = pag
c960: 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[21];.    pBt-
c970: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
c980: 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70  page1[22];.    p
c990: 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20  Bt->minLeafFrac 
c9a0: 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66  = page1[23];.#if
c9b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c9c0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
c9d0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c9e0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
c9f0: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
ca00: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
ca10: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
ca20: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
ca30: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
ca40: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
ca50: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
ca60: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
ca70: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
ca80: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
ca90: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
caa0: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
cab0: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
cac0: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
cad0: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
cae0: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
caf0: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
cb00: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
cb10: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
cb20: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
cb30: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
cb40: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
cb50: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
cb60: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
cb70: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
cb80: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
cb90: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
cba0: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
cbb0: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
cbc0: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
cbd0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
cbe0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
cbf0: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
cc00: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
cc10: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
cc20: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
cc30: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
cc40: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
cc50: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
cc60: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
cc70: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
cc80: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
cc90: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
cca0: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
ccb0: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
ccc0: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32 35  >maxEmbedFrac/25
ccd0: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
cce0: 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
ccf0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
cd00: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
cd10: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
cd20: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
cd30: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
cd40: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
cd50: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
cd60: 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
cd70: 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20 32  LeafFrac/255 - 2
cd80: 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
cd90: 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
cda0: 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
cdb0: 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
cdc0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
cdd0: 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
cde0: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
cdf0: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
ce00: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
ce10: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
ce20: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
ce30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
ce40: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
ce50: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
ce60: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
ce70: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
ce80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
ce90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
cea0: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
ceb0: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
cec0: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
ced0: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
cee0: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
cef0: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
cf00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
cf10: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
cf20: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
cf30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cf40: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
cf50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
cf60: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
cf70: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
cf80: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
cf90: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
cfa0: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
cfb0: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
cfc0: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
cfd0: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
cfe0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
cff0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
d000: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
d010: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
d020: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
d030: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
d040: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
d050: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
d060: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d070: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
d080: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
d090: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
d0a0: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
d0b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d0c0: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
d0d0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
d0e0: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
d0f0: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
d100: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
d110: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
d120: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
d130: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
d140: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
d150: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
d160: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
d170: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
d180: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d190: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
d1a0: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
d1b0: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
d1c0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
d1d0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
d1e0: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
d1f0: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
d200: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
d210: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
d220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
d230: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
d240: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d260: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
d270: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
d280: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
d290: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d2a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d2b0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
d2c0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
d2d0: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
d2e0: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
d2f0: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
d300: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d310: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
d320: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
d330: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
d340: 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b  ge1->aData==0 ){
d350: 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
d360: 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70   *pPage = pBt->p
d370: 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70  Page1;.        p
d380: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
d390: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
d3a0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d3b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
d3c0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
d3d0: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
d3e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
d3f0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
d400: 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
d410: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
d420: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
d430: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
d440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
d450: 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
d460: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
d470: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
d480: 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
d490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
d4a0: 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
d4b0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
d4c0: 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
d4d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
d4e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
d4f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d500: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d510: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tex) );.  if( sq
d520: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
d530: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
d540: 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
d550: 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70  TE_OK;.  pP1 = p
d560: 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
d570: 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
d580: 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
d590: 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
d5a0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
d5b0: 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
d5c0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d5d0: 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
d5e0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
d5f0: 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
d600: 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
d610: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
d620: 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
d630: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
d640: 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
d650: 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
d660: 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
d670: 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  1;.  data[20] = 
d680: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d690: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
d6a0: 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42  .  data[21] = pB
d6b0: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b  t->maxEmbedFrac;
d6c0: 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42  .  data[22] = pB
d6d0: 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b  t->minEmbedFrac;
d6e0: 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42  .  data[23] = pB
d6f0: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a  t->minLeafFrac;.
d700: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
d710: 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
d720: 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
d730: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
d740: 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
d750: 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
d760: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
d770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d780: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
d790: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
d7a0: 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
d7b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
d7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
d7d0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
d7e0: 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
d7f0: 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
d800: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
d810: 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
d820: 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
d830: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
d840: 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
d850: 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  um);.#endif.  re
d860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
d880: 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
d890: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
d8a0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d8b0: 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
d8c0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
d8d0: 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
d8e0: 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
d8f0: 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
d900: 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
d910: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
d920: 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
d930: 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
d940: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
d950: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
d960: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
d970: 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
d980: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
d990: 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
d9a0: 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
d9b0: 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
d9c0: 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
d9d0: 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
d9e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
d9f0: 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
da00: 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
da10: 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
da20: 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
da30: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
da40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
da50: 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
da60: 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
da70: 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
da80: 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
da90: 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
daa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
dab0: 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
dac0: 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
dad0: 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
dae0: 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
daf0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
db00: 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
db10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
db20: 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
db30: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
db40: 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
db50: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
db60: 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
db70: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
db80: 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
db90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
dba0: 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
dbb0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
dbc0: 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
dbd0: 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
dbe0: 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
dbf0: 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
dc00: 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
dc10: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
dc20: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
dc30: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
dc40: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
dc50: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
dc60: 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
dc70: 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
dc80: 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
dc90: 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
dca0: 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
dcb0: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
dcc0: 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
dcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
dce0: 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
dcf0: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
dd00: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
dd10: 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
dd20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
dd30: 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
dd40: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
dd50: 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
dd60: 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
dd70: 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
dd80: 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
dd90: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
dda0: 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
ddb0: 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
ddc0: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
ddd0: 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
dde0: 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
ddf0: 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
de00: 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
de10: 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
de20: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
de30: 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
de40: 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
de50: 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
de60: 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
de70: 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
de80: 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
de90: 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
dea0: 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
deb0: 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
dec0: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
ded0: 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
dee0: 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
def0: 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
df00: 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
df10: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
df20: 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
df30: 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42  int wrflag){.  B
df40: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
df50: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
df60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
df70: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
df80: 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
df90: 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
dfa0: 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
dfb0: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
dfc0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
dfd0: 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
dfe0: 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
dff0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
e000: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
e010: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
e020: 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
e030: 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
e040: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
e050: 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
e060: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
e070: 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
e080: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
e090: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
e0a0: 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
e0b0: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
e0c0: 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
e0d0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
e0e0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
e0f0: 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
e100: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
e110: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
e120: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
e130: 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  gun;.  }..  /* I
e140: 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
e150: 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
e160: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
e170: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e180: 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
e190: 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
e1a0: 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
e1b0: 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
e1c0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
e1d0: 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
e1e0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f  QLITE_BUSY..  */
e1f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
e200: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
e210: 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67  _WRITE && wrflag
e220: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
e230: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
e240: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
e250: 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20    }..  do {.    
e260: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
e270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
e280: 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b   lockBtree(pBt);
e290: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e2a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e2b0: 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
e2c0: 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
e2d0: 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
e2e0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
e2f0: 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
e300: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e310: 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
e320: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
e330: 50 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b  Page, wrflag>1);
e340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
e350: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e360: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
e370: 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
e380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e390: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
e3a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e3b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  ){.      if( wrf
e3c0: 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d  lag ) pBt->inStm
e3d0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
e3e0: 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
e3f0: 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
e400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
e410: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
e420: 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
e430: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
e440: 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
e450: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
e460: 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syHandler(pBt->p
e470: 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
e480: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e490: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
e4a0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
e4b0: 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
e4c0: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
e4d0: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n++;.    }.    p
e4e0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
e4f0: 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
e500: 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
e510: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
e520: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
e530: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
e540: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
e550: 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
e560: 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
e570: 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74  egun:.  btreeInt
e580: 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
e590: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e5a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e5b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e5c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e5d0: 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
e5e0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
e5f0: 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
e600: 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
e610: 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
e620: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
e630: 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
e640: 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
e650: 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
e660: 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
e670: 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
e680: 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
e690: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
e6a0: 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
e6b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e6c0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
e6f0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
e700: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e730: 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
e740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e770: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
e780: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e790: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
e7a0: 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
e7b0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
e7c0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
e7d0: 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
e7e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e7f0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e800: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
e810: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
e820: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
e830: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
e840: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e850: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
e860: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
e870: 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
e880: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
e890: 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
e8a0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
e8b0: 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
e8c0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
e8d0: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
e8e0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
e8f0: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
e900: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e910: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
e920: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
e930: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
e940: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
e950: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
e960: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
e970: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
e980: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
e990: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
e9a0: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
e9b0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
e9c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e9d0: 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
e9e0: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
e9f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
ea00: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
ea10: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
ea20: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
ea30: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
ea40: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
ea50: 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
ea60: 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
ea70: 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
ea80: 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
ea90: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
eaa0: 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
eab0: 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
eac0: 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
ead0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
eae0: 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
eaf0: 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
eb00: 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
eb10: 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
eb20: 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
eb30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
eb40: 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
eb50: 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
eb60: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
eb70: 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
eb80: 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
eb90: 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
eba0: 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
ebb0: 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
ebc0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ebd0: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
ebe0: 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
ebf0: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
ec00: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
ec10: 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
ec30: 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
ec40: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
ec50: 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
ec60: 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
ec70: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
ec80: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
ecb0: 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
ecc0: 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
ecd0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
ece0: 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
ecf0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
ed00: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
ed10: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
ed20: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
ed30: 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
ed40: 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
ed50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ed60: 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
ed70: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
ed80: 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
ed90: 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
eda0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
edb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
edc0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
edd0: 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  x) );.  if( eTyp
ede0: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
edf0: 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
ee00: 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
ee10: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
ee20: 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
ee30: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
ee40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
ee50: 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
ee60: 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
ee70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ee80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ee90: 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
eea0: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
eeb0: 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
eec0: 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69     int isInitOri
eed0: 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
eee0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
eef0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
ef00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
ef10: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
ef20: 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
ef30: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
ef40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
ef50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
ef60: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
ef70: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
ef80: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
ef90: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
efa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
efb0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
efc0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
efd0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
efe0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
eff0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
f000: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
f010: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
f020: 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
f030: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
f040: 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
f050: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
f060: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
f070: 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
f080: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f090: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f0a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f0b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
f0c0: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
f0d0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
f0e0: 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
f0f0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
f100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f110: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f120: 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
f130: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
f140: 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
f150: 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
f160: 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
f170: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
f180: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
f190: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
f1a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f1b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
f1d0: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
f1e0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
f1f0: 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
f200: 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
f210: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
f220: 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
f230: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f240: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
f250: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
f260: 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
f270: 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
f280: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
f290: 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
f2a0: 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
f2b0: 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74  ins valid..*/.st
f2c0: 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
f2d0: 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
f2e0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
f2f0: 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
f300: 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
f310: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
f320: 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
f330: 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
f340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f350: 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
f360: 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
f370: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
f380: 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
f390: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
f3a0: 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
f3b0: 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
f3c0: 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
f3d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f3e0: 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
f3f0: 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
f400: 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
f410: 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
f420: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
f430: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
f440: 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
f450: 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
f460: 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
f470: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
f480: 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
f490: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
f4a0: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
f4b0: 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
f4c0: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
f4d0: 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
f4e0: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
f4f0: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
f500: 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
f510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f520: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f530: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
f540: 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
f550: 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
f560: 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
f570: 65 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72  e from it's curr
f580: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
f590: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
f5a0: 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
f5b0: 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
f5c0: 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
f5d0: 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
f5e0: 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
f5f0: 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
f600: 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
f610: 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
f620: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
f630: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
f640: 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
f650: 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
f660: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f670: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
f680: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
f690: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
f6a0: 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
f6b0: 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
f6c0: 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
f6d0: 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
f6e0: 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
f6f0: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
f700: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
f710: 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
f720: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
f730: 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
f740: 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
f750: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
f760: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
f770: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
f780: 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
f790: 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
f7a0: 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
f7b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
f7c0: 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
f7d0: 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
f7e0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
f7f0: 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
f800: 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
f810: 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
f820: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
f830: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
f840: 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
f850: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
f860: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
f870: 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
f880: 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
f890: 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
f8a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f8b0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
f8c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
f8d0: 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
f8e0: 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
f8f0: 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
f900: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
f910: 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
f920: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
f930: 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
f940: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
f950: 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
f960: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f970: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
f980: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
f990: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
f9a0: 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
f9b0: 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
f9c0: 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
f9d0: 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
f9e0: 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
f9f0: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
fa00: 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
fa10: 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
fa20: 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
fa30: 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
fa40: 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
fa50: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
fa60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fa70: 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
fa80: 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
fa90: 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
faa0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fab0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fac0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
fad0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
fae0: 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
faf0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
fb00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fb10: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
fb20: 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
fb30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fb40: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fb50: 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
fb60: 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
fb70: 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
fb80: 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
fb90: 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
fba0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
fbb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fbc0: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
fbd0: 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
fbe0: 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
fbf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
fc00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
fc10: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
fc20: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
fc30: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
fc40: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
fc50: 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
fc60: 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
fc70: 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
fc80: 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
fc90: 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
fca0: 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
fcb0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
fcc0: 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
fcd0: 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
fce0: 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
fcf0: 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
fd00: 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
fd10: 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
fd20: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
fd30: 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
fd40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fd50: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
fd60: 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
fd70: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
fd80: 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
fd90: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
fda0: 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
fdb0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
fdc0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
fdd0: 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
fde0: 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
fdf0: 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
fe00: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
fe10: 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ro, the implemen
fe20: 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  tation assumes.*
fe30: 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
fe40: 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
fe50: 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
fe60: 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
fe70: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
fe80: 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
fe90: 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
fea0: 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
feb0: 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
fec0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
fed0: 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
fee0: 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
fef0: 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a  is complete..*/.
ff00: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
ff10: 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
ff20: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
ff30: 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73  in){.  Pgno iLas
ff40: 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  tPg;            
ff50: 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e   /* Last page in
ff60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
ff70: 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
ff80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
ff90: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
ffa0: 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
ffb0: 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
ffc0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ffd0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
ffe0: 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67  ex) );.  iLastPg
fff0: 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
10000 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30    if( iLastPg==0
10010 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20   ){.    iLastPg 
10020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
10030 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
10040 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
10050 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
10060 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
10070 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
10080 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
10090 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
100a0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
100b0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
100c0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
100d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
100e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
100f0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
10100 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69  eeList==0 || nFi
10110 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20  n==iLastPg ){.  
10120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10130 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10140 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
10150 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
10160 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
10170 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
10180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
101a0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
101b0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
101c0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
101d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
101e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
101f0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
10200 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
10210 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
10220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
10230 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
10240 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
10250 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
10260 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
10270 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
10280 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
10290 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
102a0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
102b0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
102c0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
102d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
102e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
102f0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
10300 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
10310 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
10320 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
10330 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
10340 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
10350 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
10360 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
10370 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
10380 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
10390 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
103a0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
103b0 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
103c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
103d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
103e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
103f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
10400 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
10410 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
10420 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
10430 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
10440 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
10450 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10470 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
10480 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
10490 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
104a0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
104b0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
104c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
104d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
104e0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
104f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10520 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
10530 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
10540 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
10550 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
10560 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
10570 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
10580 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
10590 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
105a0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
105b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
105c0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
105d0 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
105e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
105f0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
10600 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
10610 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
10620 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
10630 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
10640 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
10650 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
10660 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
10670 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
10680 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
10690 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
106a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
106b0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
106c0 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
106d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
106e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
106f0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
10700 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
10710 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10720 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10730 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
10740 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
10750 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
10760 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
10770 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
10780 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
10790 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
107a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
107b0 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
107c0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
107d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
107e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
107f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10800 20 7d 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72   } .      rc = r
10810 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
10820 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
10830 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
10840 50 67 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  Pg);.      relea
10850 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
10860 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10890 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20       } .    }.  
108a0 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  }..  pBt->nTrunc
108b0 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a   = iLastPg - 1;.
108c0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54    while( pBt->nT
108d0 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  runc==PENDING_BY
108e0 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
108f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
10900 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b   pBt->nTrunc) ){
10910 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  .    pBt->nTrunc
10920 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
10930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10940 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
10950 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
10960 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
10970 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
10980 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
10990 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
109a0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
109b0 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
109c0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
109d0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
109e0 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
109f0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
10a00 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
10a10 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
10a20 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
10a30 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
10a40 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
10a50 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53  or occured,.** S
10a60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
10a70 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
10a80 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
10a90 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
10aa0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
10ab0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
10ac0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
10ad0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10ae0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
10af0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
10b00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
10b10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
10b20 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
10b30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
10b40 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
10b50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
10b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
10b70 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
10b80 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
10b90 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
10ba0 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
10bb0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
10bc0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
10bd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10bf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10c00 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
10c10 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
10c20 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
10c30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
10c40 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
10c50 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
10c60 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
10c70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
10c80 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
10c90 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
10ca0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10cb0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
10cc0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
10cd0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
10ce0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
10cf0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
10d00 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
10d10 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
10d20 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
10d30 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
10d40 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
10d50 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
10d60 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
10d70 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
10d80 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70  ed *pBt, Pgno *p
10d90 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
10da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10db0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
10dc0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69   pBt->pPager;.#i
10dd0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
10de0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
10df0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
10e00 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  Pager);.#endif..
10e10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10e20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10e30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  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 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
10e70 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
10e80 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
10e90 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
10ea0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  n = 0;..    if( 
10eb0 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29  pBt->nTrunc==0 )
10ec0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72  {.      Pgno nFr
10ed0 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e  ee;.      Pgno n
10ee0 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f  Ptrmap;.      co
10ef0 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
10f00 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  Bt->pageSize;.  
10f10 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
10f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
10f30 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10f40 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  er);..      if( 
10f50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10f60 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20  t, nOrig) ){.   
10f70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10f80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10fa0 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  f( nOrig==PENDIN
10fb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
10fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69   ){.        nOri
10fd0 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
10fe0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
10ff0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11000 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
11010 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
11020 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
11030 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
11040 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
11050 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69  sz/5);.      nFi
11060 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
11070 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
11080 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
11090 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
110a0 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e  Bt) && nFin<=PEN
110b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
110c0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
110d0 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
110e0 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d       while( PTRM
110f0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
11100 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
11110 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11120 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11130 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
11140 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
11150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
11170 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
11180 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
11190 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
111a0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
111b0 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c  assert(nFin==0 |
111c0 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  | pBt->nTrunc==0
111d0 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e   || nFin<=pBt->n
111e0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63  Trunc);.      rc
111f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11200 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
11210 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  unc ){.        r
11220 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11230 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
11240 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
11250 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
11260 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
11270 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
11280 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
11290 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
112a0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  36], 0);.       
112b0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e   pBt->nTrunc = n
112c0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
112d0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
112e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
112f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
11300 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11310 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
11320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11330 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d  {.    *pnTrunc =
11340 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
11350 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
11360 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11370 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
11380 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
11390 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
113a0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f  rc;.}..#endif../
113b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
113c0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
113d0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
113e0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
113f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
11400 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
11410 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
11420 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
11430 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
11440 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
11450 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
11460 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
11470 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
11480 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
11490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
114a0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
114b0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
114c0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
114d0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
114e0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
114f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
11500 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
11510 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
11520 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
11530 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
11540 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
11550 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
11560 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
11570 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
11580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11590 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
115a0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
115b0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
115c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
115d0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
115e0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
115f0 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
11600 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
11610 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
11620 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
11630 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
11640 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
11650 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65  Commit() for the
11660 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
11670 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
11680 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
11690 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
116a0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
116b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
116c0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
116d0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
116e0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
116f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
11700 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
11710 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
11720 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
11730 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
11740 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
11750 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
11760 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
11770 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
11780 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
11790 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
117a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
117b0 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
117c0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
117d0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
117e0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
117f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11800 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
11810 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
11820 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
11830 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
11840 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
11850 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
11860 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
11870 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
11880 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
11890 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
118a0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
118b0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
118c0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
118d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
118e0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
118f0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
11900 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
11910 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
11920 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
11930 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
11940 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11950 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
11960 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
11970 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
11980 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50   = p->pBt;.    P
11990 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  gno nTrunc = 0;.
119a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
119b0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
119c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
119d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
119e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
11a00 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
11a10 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a  pBt, &nTrunc); .
11a20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11a40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11a50 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
11a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11a70 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
11a80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11a90 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
11aa0 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
11ab0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
11ac0 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  c);.    sqlite3B
11ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11ae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11af0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
11b00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
11b10 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
11b20 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
11b30 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
11b40 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
11b50 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
11b60 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
11b70 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  * sqlite3BtreeSy
11b80 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  nc() routine doe
11b90 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
11ba0 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  e and should be 
11bb0 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72  invoked.** prior
11bc0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
11bd0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
11be0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
11bf0 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a  ) routine did.**
11c00 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
11c10 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
11c20 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
11c30 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
11c40 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
11c50 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
11c60 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
11c70 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
11c80 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
11c90 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
11ca0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
11cb0 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  te the rollback 
11cc0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63  journal.** (whic
11cd0 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
11ce0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
11cf0 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63  it) and drop loc
11d00 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
11d10 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
11d20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
11d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11d40 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
11d50 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
11d60 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
11d70 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
11d80 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
11d90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
11da0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
11db0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11dc0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
11dd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11de0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
11df0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
11e00 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
11e10 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
11e20 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
11e30 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
11e40 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
11e50 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
11e60 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
11e70 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
11e80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
11e90 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
11ea0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
11eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
11ec0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
11ed0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
11ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
11ef0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
11f00 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
11f10 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
11f20 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
11f30 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
11f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11f60 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
11f70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11f80 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
11f90 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
11fa0 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69  READ;.    pBt->i
11fb0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
11fc0 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
11fd0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
11fe0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
11ff0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
12000 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
12010 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
12020 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
12030 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
12040 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
12050 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
12060 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
12070 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
12080 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
12090 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
120a0 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
120b0 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
120c0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
120d0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
120e0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
120f0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
12100 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
12110 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
12120 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
12130 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
12140 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
12150 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
12160 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
12170 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
12180 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
12190 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
121a0 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
121b0 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
121c0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
121d0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
121e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
121f0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
12200 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12210 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12220 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
12230 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12240 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12250 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12270 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
12280 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
12290 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
122a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
122b0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
122c0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
122d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
122e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
122f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
12300 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
12310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12320 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12330 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12340 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
12350 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12370 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
12380 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12390 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
123a0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
123b0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
123c0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
123d0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
123e0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
123f0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
12400 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
12410 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
12420 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
12430 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
12440 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
12450 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
12460 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
12470 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
12480 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
12490 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
124a0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
124b0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
124c0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
124d0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
124e0 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
124f0 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
12500 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
12510 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
12520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
12530 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
12540 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12550 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
12560 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
12570 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
12580 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
12590 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
125a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
125b0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
125c0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
125d0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
125e0 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
125f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12600 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
12610 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
12620 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
12630 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
12640 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
12650 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
12660 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
12670 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
12680 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
12690 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
126a0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
126b0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
126c0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
126d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
126e0 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
126f0 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
12700 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
12710 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12720 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
12730 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
12740 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
12750 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
12760 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
12770 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
12780 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
12790 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
127a0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
127b0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
127c0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
127d0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
127e0 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
127f0 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
12800 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
12810 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
12820 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
12830 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
12840 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
12850 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
12860 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12870 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
12880 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
12890 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
128a0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
128b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
128c0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
128d0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
128e0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
128f0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
12900 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
12910 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  ion(p);.    p->e
12920 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
12930 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
12940 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d  p = errCode;.  }
12950 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12960 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
12970 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
12980 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12990 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
129a0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
129b0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
129c0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
129d0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
129e0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
129f0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
12a00 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
12a10 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
12a20 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
12a30 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
12a40 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
12a50 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
12a60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
12a70 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
12a80 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
12a90 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
12aa0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
12ab0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12ac0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12ad0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
12ae0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
12af0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12b00 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
12b10 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
12b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12b30 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
12b40 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
12b50 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
12b60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
12b70 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
12b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12b90 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
12ba0 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
12bb0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
12bc0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
12bd0 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
12be0 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
12bf0 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
12c00 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
12c10 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
12c20 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
12c30 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
12c40 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
12c50 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
12c60 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
12c70 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
12c80 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
12c90 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
12ca0 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
12cb0 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
12cc0 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
12cd0 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
12ce0 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
12cf0 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
12d00 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
12d10 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
12d20 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
12d30 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
12d40 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
12d50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
12d60 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
12d70 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
12d80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
12d90 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12da0 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
12db0 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
12dc0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
12dd0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
12de0 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
12df0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12e00 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
12e10 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
12e20 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
12e30 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
12e40 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
12e50 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
12e60 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
12e70 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
12e80 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
12e90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12ea0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
12eb0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
12ec0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
12ed0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
12ee0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
12ef0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
12f00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
12f10 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
12f20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
12f30 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
12f40 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
12f50 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
12f60 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
12f70 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
12f80 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
12f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12fa0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
12fb0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
12fc0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
12fd0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
12fe0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
12ff0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
13000 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
13010 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
13020 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
13030 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13040 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
13050 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
13060 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
13070 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
13080 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
13090 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
130a0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
130b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
130c0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
130d0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
130e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
130f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
13100 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
13110 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
13120 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13130 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
13150 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
13160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
13170 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
13180 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
13190 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
131a0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
131b0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
131c0 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
131d0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
131e0 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
131f0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
13200 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
13210 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
13220 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
13230 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
13240 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
13250 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
13260 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
13270 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
13280 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
13290 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
132a0 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
132b0 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
132c0 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
132d0 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
132e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
132f0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
13300 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
13310 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
13320 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
13330 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
13340 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
13350 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
13360 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
13370 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
13380 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
13390 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
133a0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
133b0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
133c0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
133d0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
133e0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
133f0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
13400 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
13410 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
13420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13430 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
13440 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13450 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13460 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
13470 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13480 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54  );.  if( (p->inT
13490 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
134a0 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d  E) || pBt->inStm
134b0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  t ){.    rc = pB
134c0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
134d0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
134e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
134f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
13500 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
13510 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
13520 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  TE );.    rc = p
13530 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
13540 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
13550 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
13560 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
13570 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
13580 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
13590 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
135a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
135b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
135c0 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72  e statment subtr
135d0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
135e0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
135f0 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72    If no.** subtr
13600 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
13610 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ive, this is a n
13620 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
13630 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
13640 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
13650 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
13660 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13670 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
13680 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13690 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
136a0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
136b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
136c0 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
136d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
136e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
136f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
13700 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
13710 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
13720 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13740 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
13750 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
13760 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
13770 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
13780 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
13790 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
137a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
137b0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
137c0 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
137d0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
137e0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
137f0 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
13800 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
13810 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
13820 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
13830 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
13840 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
13850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13860 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
13870 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
13880 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13890 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
138a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
138b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
138c0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  (p);.  sqlite3Ma
138d0 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a  llocDisallow();.
138e0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
138f0 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
13900 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
13910 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
13920 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
13930 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
13940 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
13950 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
13960 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
13970 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
13980 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b  e3MallocAllow();
13990 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
139a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
139b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
139c0 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61  efault key compa
139d0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  rison function t
139e0 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f 20  o be used if no 
139f0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
13a00 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69 66  ion.** is specif
13a10 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69 74  ied on the sqlit
13a20 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20  e3BtreeCursor() 
13a30 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
13a40 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65 28  int dfltCompare(
13a50 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
13a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13a70 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e 6f   User data is no
13a80 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
13a90 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n1, const void *
13aa0 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  p1,    /* First 
13ab0 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
13ac0 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73  /.  int n2, cons
13ad0 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20 2f  t void *p2     /
13ae0 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20  * Second key to 
13af0 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20  compare */.){.  
13b00 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d  int c;.  c = mem
13b10 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e  cmp(p1, p2, n1<n
13b20 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20  2 ? n1 : n2);.  
13b30 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
13b40 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d  c = n1 - n2;.  }
13b50 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
13b60 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
13b70 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
13b80 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
13b90 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
13ba0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
13bb0 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
13bc0 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
13bd0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
13be0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
13bf0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
13c00 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
13c10 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
13c20 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
13c30 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
13c40 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
13c50 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
13c60 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
13c70 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
13c80 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
13c90 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
13ca0 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
13cb0 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
13cc0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
13cd0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
13ce0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
13cf0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
13d00 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
13d10 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
13d20 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
13d30 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
13d40 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
13d50 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13d60 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
13d70 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
13d80 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
13d90 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
13da0 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
13db0 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
13dc0 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
13dd0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
13de0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
13df0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
13e00 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
13e10 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
13e20 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
13e30 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
13e40 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
13e50 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
13e60 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
13e70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13e80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
13e90 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
13ea0 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
13eb0 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
13ec0 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
13ed0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
13ee0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
13ef0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
13f00 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
13f10 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
13f20 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
13f30 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
13f40 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
13f50 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
13f60 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
13f70 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
13f80 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
13f90 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
13fa0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
13fb0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
13fc0 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73 61  logically the sa
13fd0 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  me for every cur
13fe0 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74  sor.** on a part
13ff0 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 43  icular table.  C
14000 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d 70  hanging the comp
14010 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
14020 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
14030 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65 72  n incorrect oper
14040 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20  ations.  If the 
14050 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
14060 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a  ion is NULL, a.*
14070 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61 72  * default compar
14080 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
14090 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d 70   used.  The comp
140a0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
140b0 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e  is.** always ign
140c0 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59 20  ored for INTKEY 
140d0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
140e0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
140f0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
14130 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14160 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
14170 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
14180 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
141b0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
141c0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  ead-only */.  in
141d0 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c  t (*xCmp)(void*,
141e0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
141f0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
14200 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69  , /* Key Compari
14210 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f  son func */.  vo
14220 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14250 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
14260 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
14270 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20  or **ppCur      
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
142a0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
142b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
142c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
142d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
142e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
142f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
14300 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
14310 29 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20 30 3b  );.  *ppCur = 0;
14320 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
14330 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
14340 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
14350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
14360 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
14370 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
14380 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
14390 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
143a0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
143b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
143c0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
143d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  0 ){.    rc = lo
143e0 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
143f0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
14400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
14430 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
14440 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65  Flag ){.      re
14450 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
14460 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
14470 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33    pCur = sqlite3
14480 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
14490 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69  of(*pCur) );.  i
144a0 66 28 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20  f( pCur==0 ){.  
144b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
144c0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  MEM;.    goto cr
144d0 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
144e0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75  ption;.  }.  pCu
144f0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
14500 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66  gno)iTable;.  if
14510 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73  ( iTable==1 && s
14520 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
14530 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
14540 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
14550 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
14560 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
14570 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
14580 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
14590 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
145a0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
145b0 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29  &pCur->pPage, 0)
145c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
145d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
145e0 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
145f0 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  exception;.  }..
14600 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
14610 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
14620 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
14630 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
14640 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
14650 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65  iables, link the
14660 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
14670 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61   BtShared list a
14680 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74  nd set *ppCur (t
14690 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61  he.  ** output a
146a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
146b0 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a  function)..  */.
146c0 20 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65    pCur->xCompare
146d0 20 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a   = xCmp ? xCmp :
146e0 20 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20   dfltCompare;.  
146f0 70 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72  pCur->pArg = pAr
14700 67 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  g;.  pCur->pBtre
14710 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
14720 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
14730 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61  ->wrFlag = wrFla
14740 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
14750 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
14760 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
14770 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
14780 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14790 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
147a0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
147b0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
147c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
147d0 0a 20 20 2a 70 70 43 75 72 20 3d 20 70 43 75 72  .  *ppCur = pCur
147e0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
147f0 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63  TE_OK;..create_c
14800 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a  ursor_exception:
14810 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20  .  if( pCur ){. 
14820 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
14830 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
14840 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
14850 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63  ur);.  }.  unloc
14860 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
14870 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Bt);.  return rc
14880 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
14890 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
148a0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
148d0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
148e0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
14910 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
14920 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
14930 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
14960 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
14970 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d  y */.  int (*xCm
14980 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  p)(void*,int,con
14990 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
149a0 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65  st void*), /* Ke
149b0 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  y Comparison fun
149c0 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  c */.  void *pAr
149d0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
14a00 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
14a10 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a 70 70  .  BtCursor **pp
14a20 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a40 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
14a50 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
14a60 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
14a70 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14a80 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
14a90 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
14aa0 46 6c 61 67 2c 20 78 43 6d 70 2c 20 70 41 72 67  Flag, xCmp, pArg
14ab0 2c 20 70 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  , ppCur);.  sqli
14ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14ad0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14ae0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  .../*.** Close a
14af0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
14b00 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
14b10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
14b20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
14b30 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
14b40 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
14b50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
14b60 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
14b70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
14b80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
14b90 75 72 2d 3e 70 42 74 3b 0a 20 20 42 74 72 65 65  ur->pBt;.  Btree
14ba0 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
14bb0 3e 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69  >pBtree;..  sqli
14bc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
14bd0 74 72 65 65 29 3b 0a 20 20 63 6c 65 61 72 43 75  tree);.  clearCu
14be0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
14bf0 72 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r);.  if( pCur->
14c00 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 43 75  pPrev ){.    pCu
14c10 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
14c20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
14c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
14c40 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
14c50 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
14c60 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
14c70 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
14c80 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
14c90 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c  pPrev;.  }.  rel
14ca0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
14cb0 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42  Page);.  unlockB
14cc0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
14cd0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  );.  invalidateO
14ce0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
14cf0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
14d00 65 65 28 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  ee(pCur);.  sqli
14d10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
14d20 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tree);.  return 
14d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14d40 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f  .** Make a tempo
14d50 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66  rary cursor by f
14d60 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69  illing in the fi
14d70 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72  elds of pTempCur
14d80 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61  ..** The tempora
14d90 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  ry cursor is not
14da0 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c   on the cursor l
14db0 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65  ist for the Btre
14dc0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
14dd0 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
14de0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
14df0 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  Cur, BtCursor *p
14e00 54 65 6d 70 43 75 72 29 7b 0a 20 20 61 73 73 65  TempCur){.  asse
14e10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
14e20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
14e30 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
14e40 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70   pCur, sizeof(*p
14e50 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  Cur));.  pTempCu
14e60 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
14e70 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
14e80 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70  = 0;.  if( pTemp
14e90 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
14ea0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
14eb0 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  f(pTempCur->pPag
14ec0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
14ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
14ee0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
14ef0 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
14f00 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
14f10 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
14f20 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
14f30 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  above..*/.void s
14f40 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
14f50 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  seTempCursor(BtC
14f60 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
14f70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
14f80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
14f90 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  ;.  if( pCur->pP
14fa0 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
14fb0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
14fc0 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
14fd0 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
14fe0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
14ff0 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
15000 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
15010 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
15020 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
15030 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
15040 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
15050 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69  id, call.** sqli
15060 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15070 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
15080 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
15090 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
150a0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
150b0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
150c0 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
150d0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
150e0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
150f0 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
15100 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
15110 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
15120 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
15130 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
15140 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
15150 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
15160 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
15170 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
15180 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
15190 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
151a0 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
151b0 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
151c0 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
151d0 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
151e0 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
151f0 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
15200 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
15210 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
15220 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
15230 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
15240 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
15250 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
15260 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
15270 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
15280 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
15290 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
152a0 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
152b0 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
152c0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
152d0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
152e0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
152f0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
15300 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
15310 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
15320 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
15330 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15340 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
15350 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
15360 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
15370 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
15380 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
15390 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
153a0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
153b0 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
153c0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
153d0 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
153e0 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
153f0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
15400 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
15410 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
15420 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
15430 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
15440 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
15450 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
15460 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
15470 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15480 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
15490 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
154a0 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e  ->idx, &pCur->in
154b0 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fo);.    }else{.
154c0 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
154d0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
154e0 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
154f0 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
15500 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
15510 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
15520 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
15530 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
15540 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
15550 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
15560 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
155a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
155b0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
155e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
155f0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
15600 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
15610 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  x, &pCur->info);
15620 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
15630 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
15680 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
156c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
156d0 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
156e0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
156f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
15700 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
15710 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
15720 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
15730 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
15740 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
15750 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
15760 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
15770 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
15780 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
15790 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
157a0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
157b0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
157c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
157d0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
157e0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
157f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
15800 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
15810 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
15820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
15830 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
15840 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15850 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15860 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15870 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15880 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15890 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
158a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
158b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
158c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
158d0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
158e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
158f0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15900 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15910 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15920 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15940 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
15950 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
15960 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
15970 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
15980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15990 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
159a0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
159b0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
159c0 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
159d0 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
159e0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
159f0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
15a00 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
15a10 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
15a20 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
15a30 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
15a40 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
15a50 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
15a60 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
15a70 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
15a80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15a90 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
15aa0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15ab0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
15ac0 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
15ad0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
15ae0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
15af0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15b00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15b10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15b20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15b30 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15b40 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15b60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15b70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15b80 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15b90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15ba0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15bb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15bc0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15bd0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
15be0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
15bf0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
15c00 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
15c10 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
15c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
15c30 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
15c40 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
15c50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
15c60 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
15c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15c80 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
15c90 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
15ca0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
15cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
15cc0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
15cd0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
15ce0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
15cf0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
15d00 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
15d10 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
15d20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
15d30 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
15d40 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
15d50 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
15d60 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
15d70 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
15d80 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
15d90 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
15da0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
15db0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
15dc0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
15dd0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15de0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
15df0 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
15e00 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
15e10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
15e20 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
15e30 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
15e40 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
15e50 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
15e60 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
15e70 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
15e80 67 65 20 69 6e 20 69 74 27 73 20 6c 69 6e 6b 65  ge in it's linke
15e90 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  d list, *pPgnoNe
15ea0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
15eb0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
15ec0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
15ed0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
15ee0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20  to the MemPage* 
15ef0 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61  handle.** for pa
15f00 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64  ge ovfl. The und
15f10 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61  erlying pager pa
15f20 67 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ge may have been
15f30 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69   requested.** wi
15f40 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  th the noContent
15f50 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68   flag set, so th
15f60 65 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65  e page data acce
15f70 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68  ssable via.** th
15f80 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f  is handle may no
15f90 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f  t be trusted..*/
15fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
15fb0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
15fc0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
15fd0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ff0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a   Overflow page *
16000 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
16010 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
16020 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
16030 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e   handle */.  Pgn
16040 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
16050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16060 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
16070 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
16080 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
16090 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
160a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
160b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
160c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f  mutex) );.  /* O
160d0 6e 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74  ne of these must
160e0 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74   not be NULL. Ot
160f0 68 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c  herwise, why cal
16100 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f  l this function?
16110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50   */.  assert(ppP
16120 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74  age || pPgnoNext
16130 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e  );..  /* If pPgn
16140 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
16150 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
16160 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
16170 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  d to obtain.  **
16180 20 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65   a MemPage* refe
16190 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70  rence only. No p
161a0 61 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75  age-data is requ
161b0 69 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ired in this cas
161c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
161d0 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20  PgnoNext ){.    
161e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
161f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16200 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29  ovfl, ppPage, 1)
16210 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
16220 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16230 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
16240 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
16250 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
16260 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
16270 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
16280 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
16290 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
162a0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
162b0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
162c0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
162d0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
162e0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
162f0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
16300 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
16310 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
16320 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
16330 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
16340 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
16350 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
16360 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
16370 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
16380 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
16390 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
163a0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
163b0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
163c0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
163d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
163e0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
163f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
16400 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
16410 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
16420 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
16430 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  <=sqlite3PagerPa
16440 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
16450 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
16460 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
16470 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
16480 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
16490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
164a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
164b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
164c0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
164d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
164e0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
164f0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
16500 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
16510 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
16520 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d  if..  if( next==
16530 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20  0 || ppPage ){. 
16540 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
16550 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  e = 0;..    rc =
16560 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16570 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
16580 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29  &pPage, next!=0)
16590 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d  ;.    assert(rc=
165a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
165b0 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28  age==0);.    if(
165c0 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d   next==0 && rc==
165d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
165e0 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
165f0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
16600 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16610 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20   ppPage ){.     
16620 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
16630 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16640 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16650 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
16660 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
16670 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  next;..  return 
16680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  rc;.}../*.** Cop
16690 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
166a0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
166b0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
166c0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
166d0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
166e0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
166f0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
16700 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
16710 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
16720 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
16730 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
16740 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
16750 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
16760 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
16770 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
16780 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
16790 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
167a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
167b0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
167c0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
167d0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
167e0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
167f0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
16800 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
16810 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
16820 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
16830 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
16840 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
16850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
16860 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
16870 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
16880 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16890 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
168a0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
168c0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
168d0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
168e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
168f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16900 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
16910 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
16920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
16930 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
16940 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
16950 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
16960 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
16970 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
16980 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
16990 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
169a0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
169b0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
169c0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
169d0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
169e0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
169f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
16a00 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
16a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16a20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
16a40 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
16a50 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
16a60 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
16a70 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
16a80 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
16a90 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
16aa0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
16ab0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
16ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16ae0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16af0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
16b00 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
16b10 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
16b20 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
16b30 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
16b40 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
16b50 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
16b60 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
16b70 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
16b80 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
16b90 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
16ba0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
16bb0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
16bc0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
16bd0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
16be0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
16bf0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
16c00 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
16c10 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
16c20 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
16c30 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
16c40 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
16c50 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
16c60 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
16c70 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
16c80 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
16c90 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
16ca0 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
16cb0 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
16cc0 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
16cd0 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
16ce0 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
16cf0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
16d00 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
16d10 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
16d20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
16d30 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
16d40 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
16d50 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
16d60 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
16d70 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
16d80 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
16d90 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
16da0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
16db0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16dc0 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
16dd0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
16de0 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
16df0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
16e00 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
16e10 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
16e20 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
16e30 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
16e40 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
16e50 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
16e60 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
16e70 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
16e80 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
16e90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
16ea0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
16eb0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
16ec0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
16ed0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
16ee0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
16ef0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
16f00 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
16f10 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
16f20 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
16f30 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
16f40 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
16f50 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
16f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
16f70 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
16f80 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
16f90 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
16fa0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
16fb0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
16fc0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
16fd0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
16fe0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
16ff0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
17000 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
17010 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
17020 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
17030 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
17040 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
17050 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
17060 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
17070 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
17080 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
17090 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
170a0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
170b0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
170c0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74  payload */.  int
170d0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
170e0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
170f0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
17100 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
17110 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
17120 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
17130 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
17140 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
17150 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
17160 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
17170 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
17180 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
17190 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
171a0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
171b0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
171c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
171d0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
171e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
171f0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
17200 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
17210 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
17220 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
17230 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
17240 66 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  f current cursor
17250 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
17260 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
17270 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a  ->pBt;        /*
17280 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
17290 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
172a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
172b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
172c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
172d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
172e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
172f0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
17300 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
17310 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
17320 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
17330 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
17340 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
17350 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
17360 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
17370 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
17380 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
17390 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
173a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
173b0 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  0 : pCur->info.n
173c0 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69  Key);..  if( ski
173d0 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73  pKey ){.    offs
173e0 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  et += nKey;.  }.
173f0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
17400 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
17410 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  fo.nData ){.    
17420 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
17430 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
17440 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
17450 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
17460 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
17470 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
17480 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
17490 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
174a0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
174b0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
174c0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
174d0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
174e0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
174f0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
17500 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
17510 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
17520 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
17530 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
17540 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
17550 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
17560 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
17570 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
17580 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
17590 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
175a0 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
175b0 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
175c0 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
175d0 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
175e0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
175f0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
17600 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
17610 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
17620 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
17630 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
17640 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
17650 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
17660 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
17670 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
17680 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
17690 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
176a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
176b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
176c0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
176d0 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
176e0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
176f0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
17700 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
17710 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
17720 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
17730 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
17740 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
17750 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
17760 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
17770 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
17780 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
17790 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
177a0 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
177b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
177c0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
177d0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
177e0 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
177f0 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
17800 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
17810 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
17820 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
17830 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
17840 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
17850 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
17860 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
17870 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
17880 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
17890 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
178a0 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
178b0 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
178c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
178d0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
178e0 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
178f0 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
17900 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
17910 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f  Zero(sizeof(Pgno
17920 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
17930 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43  if( nOvfl && !pC
17940 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
17950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
17960 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17970 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17980 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
17990 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
179a0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
179b0 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
179c0 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
179d0 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
179e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
179f0 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
17a00 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
17a10 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
17a20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
17a30 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
17a40 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
17a50 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
17a60 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
17a70 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
17a80 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
17a90 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
17aa0 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
17ab0 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
17ac0 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
17ad0 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
17ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
17af0 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
17b00 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
17b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17b20 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
17b30 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
17b40 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
17b50 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
17b60 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
17b70 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
17b80 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
17b90 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
17ba0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
17bb0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
17bc0 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
17bd0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
17be0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
17bf0 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
17c00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
17c10 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
17c20 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
17c30 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
17c40 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
17c50 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
17c60 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
17c70 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
17c80 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
17c90 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
17ca0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
17cb0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
17cc0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
17cd0 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
17ce0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
17cf0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
17d00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
17d10 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
17d20 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
17d30 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
17d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
17d50 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
17d60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d70 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
17d80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
17d90 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
17da0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17db0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
17dc0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
17dd0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17de0 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20  x+1];.        } 
17df0 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
17e00 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
17e10 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
17e20 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
17e30 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
17e40 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
17e50 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
17e60 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
17e70 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
17e80 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
17e90 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
17ea0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
17eb0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
17ec0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
17ed0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
17ee0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
17ef0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17f00 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
17f10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
17f20 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
17f30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17f40 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
17f50 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
17f60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
17f70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17f90 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
17fa0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
17fb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
17fc0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
17fd0 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
17fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17ff0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
18000 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
18010 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
18020 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
18030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18040 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
18050 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
18060 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
18070 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
18080 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18090 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
180a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
180b0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
180c0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
180d0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b            pBuf +
180e0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = a;.        }. 
180f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18100 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
18110 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
18120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18130 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
18160 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
18170 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18180 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
18190 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
181a0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
181b0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
181c0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
181d0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
181e0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
181f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18200 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
18210 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
18220 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
18230 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
18240 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
18250 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
18260 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
18270 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
18280 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
18290 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
182a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
182b0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
182c0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
182d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
182e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
182f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18300 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
18310 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
18320 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
18330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18340 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18350 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18360 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
18370 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18380 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  age!=0 );.    if
18390 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
183a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
183b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
183c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
183d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
183e0 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
183f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
18400 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
18410 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
18420 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
18430 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
18440 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
18450 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
18460 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
18470 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 0, 0);.  }.  
18480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18490 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
184a0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
184b0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
184c0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
184d0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
184e0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
184f0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18500 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18510 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18520 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
18530 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18540 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
18550 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
18560 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
18570 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
18580 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
18590 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
185a0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
185b0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
185c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
185d0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
185e0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
185f0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18600 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
18610 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18620 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
18630 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
18640 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
18650 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
18660 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
18670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18680 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
18690 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
186a0 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
186b0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  ( pCur->pPage!=0
186c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
186d0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
186e0 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
186f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18700 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
18710 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
18720 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
18730 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
18740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18750 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
18760 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
18770 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
18780 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
18790 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
187a0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
187b0 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
187c0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
187d0 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
187e0 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
187f0 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
18800 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
18810 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
18820 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
18830 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
18840 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
18850 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
18860 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
18870 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
18880 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
18890 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
188a0 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
188b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
188c0 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
188d0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
188e0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
188f0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
18900 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
18910 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
18920 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
18930 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
18940 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
18950 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
18960 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
18970 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
18980 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
18990 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
189a0 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
189b0 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
189c0 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
189d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
189e0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
189f0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
18a00 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a  d to reassembly.
18a10 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
18a20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
18a30 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
18a40 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
18a50 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
18a60 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
18a70 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
18a80 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
18a90 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
18aa0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
18ab0 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
18ac0 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
18ad0 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
18ae0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
18af0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
18b00 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
18b10 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
18b20 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
18b30 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
18b40 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
18b50 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
18b60 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
18b70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
18b80 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
18b90 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
18ba0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
18bb0 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
18bc0 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
18bd0 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
18be0 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
18bf0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
18c00 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
18c10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
18c20 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
18c30 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  int nLocal;..  a
18c40 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
18c50 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  & pCur->pPage!=0
18c60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
18c70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18c80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
18c90 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
18ca0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18cb0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
18cc0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
18cd0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18ce0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
18cf0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
18d00 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
18d10 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
18d20 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
18d30 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
18d40 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
18d50 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
18d60 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
18d70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
18d80 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e     nKey = pCur->
18d90 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
18da0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
18db0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20      aPayload += 
18dc0 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  nKey;.    nLocal
18dd0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
18de0 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d  ocal - nKey;.  }
18df0 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c  else{.    nLocal
18e00 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
18e10 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c  ocal;.    if( nL
18e20 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20  ocal>nKey ){.   
18e30 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79     nLocal = nKey
18e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
18e50 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
18e60 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
18e70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
18e80 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
18e90 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
18ea0 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
18eb0 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
18ec0 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
18ed0 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
18ee0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
18ef0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
18f00 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
18f10 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
18f20 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
18f30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
18f40 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
18f50 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
18f60 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
18f70 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
18f80 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
18f90 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
18fa0 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
18fb0 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
18fc0 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
18fd0 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
18fe0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
18ff0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
19000 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
19010 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
19020 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
19030 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
19040 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
19050 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
19060 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
19070 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
19080 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
19090 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
190a0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
190b0 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
190c0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
190d0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
190e0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
190f0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
19100 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19110 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
19120 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19130 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
19140 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
19150 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
19160 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
19170 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19180 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
19190 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
191a0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
191b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
191c0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
191d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
191e0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
191f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19200 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
19210 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
19220 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
19230 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
19240 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19250 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
19260 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19270 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
19280 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
19290 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
192a0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
192b0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
192c0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a   to move to..*/.
192d0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
192e0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
192f0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
19300 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
19310 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
19320 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
19330 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61  OldPage;.  BtSha
19340 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
19350 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
19360 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19370 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
19380 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19390 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
193a0 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  );.  rc = getAnd
193b0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
193c0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
193d0 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  , pCur->pPage);.
193e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
193f0 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65  n rc;.  pNewPage
19400 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43  ->idxParent = pC
19410 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50  ur->idx;.  pOldP
19420 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19430 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69  e;.  pOldPage->i
19440 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
19450 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50  eleasePage(pOldP
19460 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
19470 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  age = pNewPage;.
19480 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
19490 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
194a0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
194b0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
194c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
194d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
194e0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
194f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
19510 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19520 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
19530 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
19540 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
19550 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19560 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
19570 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
19580 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
19590 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
195a0 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
195b0 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
195c0 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
195d0 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
195e0 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
195f0 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
19600 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19610 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
19620 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
19630 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
19640 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
19650 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
19660 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
19670 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
19680 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
19690 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
196a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
196b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
196c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 72  mutex) );.  pPar
196d0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
196e0 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
196f0 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
19700 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
19710 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
19720 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
19730 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
19740 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
19750 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
19760 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
19770 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
19780 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
19790 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
197a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
197b0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
197c0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
197d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
197e0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
197f0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
19800 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
19810 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19820 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
19830 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
19840 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
19850 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
19860 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
19870 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
19880 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19890 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
198a0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
198b0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
198c0 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67  Parent;.  MemPag
198d0 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
198e0 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73  idxParent;..  as
198f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19900 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19910 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19920 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
19930 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20  ALID );.  pPage 
19940 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
19950 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
19960 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
19970 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
19980 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 3b  otPage(pPage) );
19990 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
199a0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
199b0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
199c0 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74  0 );.  idxParent
199d0 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72   = pPage->idxPar
199e0 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ent;.  sqlite3Pa
199f0 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
19a00 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  pDbPage);.  rele
19a10 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
19a20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
19a30 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d  pParent;.  pCur-
19a40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
19a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
19a60 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20  nt->idxShift==0 
19a70 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  );.  pCur->idx =
19a80 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f   idxParent;.}../
19a90 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19aa0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  rsor to the root
19ab0 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
19ac0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
19ad0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19ae0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
19af0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19b00 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
19b10 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
19b20 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
19b30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
19b40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19b50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19b60 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
19b70 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
19b80 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
19b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
19ba0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
19bb0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
19bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
19bd0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
19be0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
19bf0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
19c00 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
19c10 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
19c20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
19c30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
19c40 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
19c50 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
19c60 20 20 7d 0a 20 20 20 20 63 6c 65 61 72 43 75 72    }.    clearCur
19c70 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
19c80 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  );.  }.  pRoot =
19c90 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
19ca0 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f  if( pRoot && pRo
19cb0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
19cc0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
19cd0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
19ce0 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65  sInit );.  }else
19cf0 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
19d00 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
19d10 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
19d20 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
19d30 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
19d40 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
19d50 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
19d60 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
19d70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19d80 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
19d90 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
19da0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  );.    pCur->pPa
19db0 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a  ge = pRoot;.  }.
19dc0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
19dd0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19de0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
19df0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
19e00 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
19e10 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
19e20 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
19e30 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
19e40 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
19e50 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
19e60 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
19e70 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
19e80 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
19e90 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
19ea0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19eb0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
19ec0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
19ed0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a  , subpage);.  }.
19ee0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
19ef0 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   ((pCur->pPage->
19f00 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
19f10 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
19f20 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  ALID);.  return 
19f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
19f40 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
19f50 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
19f60 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
19f70 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
19f80 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
19f90 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
19fa0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
19fb0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
19fc0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
19fd0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
19fe0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
19ff0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1a000 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a010 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1a020 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a030 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1a040 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a050 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1a060 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1a070 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a080 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a090 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a0a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a0b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1a0c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1a0d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1a0e0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
1a0f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1a100 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
1a110 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
1a120 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
1a130 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1a140 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
1a150 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
1a160 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1a170 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
1a180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a190 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a1a0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
1a1b0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1a1c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1a1d0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
1a1e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1a1f0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
1a200 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
1a210 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
1a220 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
1a230 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1a240 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
1a250 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1a260 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
1a270 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
1a280 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
1a290 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
1a2a0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
1a2b0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
1a2c0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
1a2d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
1a2e0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
1a2f0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1a300 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
1a310 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
1a320 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1a330 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a340 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1a350 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1a360 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1a370 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a380 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1a390 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1a3a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a3b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1a3c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a3d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a3e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1a3f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1a400 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1a410 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
1a420 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1a430 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1a440 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1a450 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
1a460 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
1a470 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
1a480 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1a490 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
1a4a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a4b0 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1a4c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20   pPage->nCell - 
1a4d0 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
1a4e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  o.nSize = 0;.  }
1a4f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
1a510 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1a520 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1a530 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1a540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1a550 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1a560 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1a570 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1a580 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1a590 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1a5a0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1a5b0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1a5c0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1a5d0 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
1a5e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1a5f0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1a600 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1a610 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a620 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1a630 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a640 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1a650 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  e->pSqlite->mute
1a660 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1a670 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1a680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a690 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
1a6a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a6b0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1a6c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a6d0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1a6e0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1a6f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1a700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1a720 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a730 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
1a740 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1a750 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1a760 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1a770 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a780 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1a790 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1a7a0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1a7b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1a7c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1a7d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1a7e0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1a7f0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1a800 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1a810 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1a820 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1a830 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1a840 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1a850 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
1a860 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1a870 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1a880 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
1a890 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a8a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1a8b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a8c0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1a8d0 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  e->pSqlite->mute
1a8e0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1a8f0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1a900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a910 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
1a920 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1a930 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1a940 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a950 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1a960 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1a970 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1a980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a990 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a9a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1a9b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1a9c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
1a9d0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1a9e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a9f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1aa00 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
1aa10 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1aa20 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
1aa30 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65  pKey/nKey..** Re
1aa40 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
1aa50 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
1aa60 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e  NTKEY tables, on
1aa70 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61  ly the nKey para
1aa80 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1aa90 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
1aaa0 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72 20 74  ed.  For other t
1aab0 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73 20 74  ables, nKey is t
1aac0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1aad0 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e  es of data.** in
1aae0 20 70 4b 65 79 2e 20 20 54 68 65 20 63 6f 6d 70   pKey.  The comp
1aaf0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1ab00 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 74  specified when t
1ab10 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
1ab20 20 63 72 65 61 74 65 64 20 69 73 20 75 73 65 64   created is used
1ab30 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65 79 73   to compare keys
1ab40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
1ab50 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
1ab60 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1ab70 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
1ab80 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
1ab90 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
1aba0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
1abb0 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
1abc0 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
1abd0 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
1abe0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
1abf0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
1ac00 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
1ac10 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
1ac20 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  *.** The result 
1ac30 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
1ac40 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
1ac50 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
1ac60 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72  .** cursor is wr
1ac70 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69  itten to *pRes i
1ac80 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54  f pRes!=NULL.  T
1ac90 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a  he meaning of.**
1aca0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   this value is a
1acb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1acc0 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
1acd0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1ace0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1acf0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1ad00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ad10 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
1ad20 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68  an pKey or if th
1ad30 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1ad40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ad50 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1ad60 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1ad70 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1ad80 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1ad90 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1ada0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1adb0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1adc0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1adf0 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  pKey..**.**     
1ae00 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
1ae10 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1ae20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1ae30 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1ae50 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65   larger than pKe
1ae60 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
1ae70 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
1ae80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1ae90 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
1aea0 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
1aeb0 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ved */.  const v
1aec0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1aed0 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e 74 65  /* The key conte
1aee0 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20  nt for indices. 
1aef0 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74 61 62   Not used by tab
1af00 6c 65 73 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  les */.  i64 nKe
1af10 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1af20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e  /* Size of pKey.
1af30 20 20 4f 72 20 74 68 65 20 6b 65 79 20 66 6f 72    Or the key for
1af40 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74   tables */.  int
1af50 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
1af60 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1af70 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1af80 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1af90 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1afb0 65 61 72 63 68 20 72 65 73 75 6c 74 20 66 6c 61  earch result fla
1afc0 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
1afd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1afe0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1aff0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1b000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b010 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1b020 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78  ->pSqlite->mutex
1b030 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1b040 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1b050 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1b060 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1b070 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1b080 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
1b090 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49  pCur->pPage->isI
1b0a0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nit );.  if( pCu
1b0b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b0c0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1b0d0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1b0e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1b0f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
1b100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b110 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f  ITE_OK;.  }.  fo
1b120 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
1b130 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
1b140 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
1b150 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1b160 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1b170 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
1b180 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
1b190 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
1b1a0 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
1b1b0 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
1b1c0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
1b1d0 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  1;.    if( !pPag
1b1e0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65  e->intKey && pKe
1b1f0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
1b200 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1b210 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1b220 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
1b230 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1b240 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20  >idx = upr;.    
1b250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
1b260 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  r->idx = (upr+lw
1b270 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1b280 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
1b290 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1b2a0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1b2b0 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1b2c0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1b2d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1b2e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1b2f0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1b300 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
1b310 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
1b320 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1b330 2d 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  ->idx) + pPage->
1b340 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
1b350 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1b360 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
1b370 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b        u32 dummy;
1b380 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1b390 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b3a0 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a  pCell, &dummy);.
1b3b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b3c0 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
1b3d0 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c  l, (u64 *)&nCell
1b3e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1b3f0 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20  ( nCellKey<nKey 
1b400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1b410 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1b420 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
1b430 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nKey ){.        
1b440 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
1b450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b460 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
1b470 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1b480 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1b490 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1b4a0 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1b4b0 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1b4c0 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1b4d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1b4e0 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1b4f0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1b500 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1b510 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1b520 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
1b530 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
1b540 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
1b550 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
1b560 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  pKey);.        }
1b570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b580 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
1b590 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  e3_malloc( nCell
1b5a0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1b5b0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1b5c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b5d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1b5e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b5f0 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1b600 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
1b610 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1b620 20 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d         c = pCur-
1b630 3e 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e  >xCompare(pCur->
1b640 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  pArg, nCellKey, 
1b650 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20  pCellKey, nKey, 
1b660 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  pKey);.         
1b670 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1b680 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1b690 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1b6a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b6b0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1b6c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b6d0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
1b6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b6f0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
1b700 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
1b710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
1b720 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
1b730 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
1b740 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
1b750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b770 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1b780 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
1b790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b7a0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
1b7b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1b7c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
1b7d0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b  r = pCur->idx+1;
1b7e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b7f0 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72        upr = pCur
1b800 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  ->idx-1;.      }
1b810 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
1b820 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
1b830 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b840 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28     pCur->idx = (
1b850 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
1b860 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1b870 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1b880 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1b890 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1b8a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1b8b0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1b8c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b8d0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1b8e0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1b8f0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1b900 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1b910 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1b920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b930 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1b940 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1b950 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1b960 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1b970 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1b980 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1b990 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
1b9a0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1b9b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   );.      if( pR
1b9c0 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a  es ) *pRes = c;.
1b9d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b9e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b9f0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77    pCur->idx = lw
1ba00 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
1ba10 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1ba20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ba30 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
1ba40 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1ba50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ba60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e      }.  }.  /* N
1ba70 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a  OT REACHED */.}.
1ba80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1ba90 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
1baa0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1bab0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
1bac0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1bad0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
1bae0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
1baf0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
1bb00 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
1bb10 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
1bb20 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1bb30 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
1bb40 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
1bb50 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
1bb60 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
1bb70 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
1bb80 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1bb90 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1bba0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
1bbb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1bbc0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
1bbd0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1bbe0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
1bbf0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
1bc00 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
1bc10 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
1bc20 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
1bc30 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
1bc40 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
1bc50 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
1bc60 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
1bc70 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
1bc80 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
1bc90 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
1bca0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
1bcb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1bcc0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1bcd0 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
1bce0 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
1bcf0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1bd00 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f  BtreeCursorDb(co
1bd10 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43  nst BtCursor *pC
1bd20 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
1bd30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1bd40 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1bd50 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65 78 29 20  pSqlite->mutex) 
1bd60 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
1bd70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74  ->pBtree->pSqlit
1bd80 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  e;.}../*.** Adva
1bd90 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
1bda0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1bdb0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1bdc0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1bdd0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1bde0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1bdf0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1be00 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1be10 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1be20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1be30 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1be40 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1be50 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1be60 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  =1..*/.static in
1be70 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
1be80 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1be90 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1bea0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1beb0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1bec0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1bed0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1bee0 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
1bef0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1bf00 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1bf10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1bf20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1bf30 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
1bf40 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1bf50 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1bf60 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1bf70 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1bf80 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1bf90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bfa0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1bfb0 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20  Cur->skip>0 ){. 
1bfc0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1bfd0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1bfe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1bff0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1c000 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
1c010 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1c020 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
1c030 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50  rt( pCur->idx<pP
1c040 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
1c050 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20   pCur->idx++;.  
1c060 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1c070 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
1c080 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->idx>=pPage->nC
1c090 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
1c0a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c0b0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1c0c0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
1c0d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1c0e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1c0f0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
1c100 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1c110 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
1c120 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1c130 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
1c140 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1c150 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c160 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73   do{.      if( s
1c170 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f  qlite3BtreeIsRoo
1c180 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1c190 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1c1a0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
1c1b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1c1c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1c1d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c1e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1c1f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1c200 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1c210 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1c220 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1c230 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69   }while( pCur->i
1c240 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
1c250 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
1c260 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1c270 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ->leafData ){.  
1c280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c290 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
1c2a0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1c2b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c2c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c2e0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1c2f0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1c300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1c320 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1c330 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
1c340 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
1c350 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
1c360 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1c370 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1c380 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
1c390 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c3a0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  Cur) );.  rc = b
1c3b0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
1c3c0 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Res);.  return r
1c3d0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
1c3e0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
1c3f0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
1c400 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
1c410 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1c420 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1c430 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1c440 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1c450 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1c460 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1c470 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1c480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1c490 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1c4a0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1c4b0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1c4c0 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
1c4d0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
1c4e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c4f0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1c500 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
1c510 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1c520 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1c530 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c540 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1c550 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
1c560 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1c570 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1c580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c590 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1c5a0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1c5b0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1c5c0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1c5d0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1c5e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1c5f0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
1c600 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1c610 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1c620 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1c630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c640 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1c650 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
1c660 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
1c670 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1c680 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1c690 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20  Cur->idx>=0 );. 
1c6a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c6b0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1c6c0 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43 65  get4byte( findCe
1c6d0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1c6e0 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  idx) );.    rc =
1c6f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1c700 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
1c710 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
1c720 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c730 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1c740 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1c750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1c760 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20  e( pCur->idx==0 
1c770 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
1c780 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1c790 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1c7a0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1c7b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1c7c0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
1c7d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1c7e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c7f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c800 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1c810 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1c820 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1c830 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1c840 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d  .    pCur->idx--
1c850 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1c860 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1c870 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1c880 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ata && !pPage->l
1c890 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1c8a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
1c8b0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
1c8c0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1c8d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c8e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
1c8f0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
1c900 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
1c910 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1c920 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
1c930 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1c940 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1c950 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1c960 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1c970 72 63 20 3d 20 62 74 72 65 65 50 72 65 76 69 6f  rc = btreePrevio
1c980 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
1c990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c9a0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1c9b0 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
1c9c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c9d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
1c9e0 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
1c9f0 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
1ca00 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
1ca10 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
1ca20 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
1ca30 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
1ca40 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
1ca50 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
1ca60 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
1ca70 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
1ca80 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
1ca90 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1caa0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
1cab0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1cac0 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
1cad0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
1cae0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1caf0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1cb00 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
1cb10 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
1cb20 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
1cb30 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
1cb40 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
1cb50 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
1cb60 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
1cb70 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
1cb80 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
1cb90 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
1cba0 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
1cbb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1cbc0 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
1cbd0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
1cbe0 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
1cbf0 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
1cc00 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
1cc10 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
1cc20 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
1cc30 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
1cc40 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
1cc50 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
1cc60 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
1cc70 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
1cc80 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
1cc90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1cca0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
1ccb0 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
1ccc0 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
1ccd0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1cce0 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
1ccf0 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
1cd00 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
1cd10 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
1cd20 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
1cd30 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1cd40 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
1cd50 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
1cd60 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
1cd70 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
1cd80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1cd90 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
1cda0 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
1cdb0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1cdc0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
1cdd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1cde0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1cdf0 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
1ce00 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
1ce10 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
1ce20 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1ce30 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
1ce40 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
1ce50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1ce60 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1ce70 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
1ce80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
1ce90 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
1cea0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1ceb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1cec0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
1ced0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
1cee0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1cef0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1cf00 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1cf10 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
1cf20 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d  t->pPage1;.  n =
1cf30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1cf40 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1cf50 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1cf60 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
1cf70 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1cf80 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
1cf90 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
1cfa0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
1cfb0 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
1cfc0 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
1cfd0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
1cfe0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
1cff0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
1d000 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
1d010 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
1d020 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
1d030 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
1d040 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
1d050 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
1d060 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1d070 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
1d080 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
1d090 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
1d0a0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
1d0b0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
1d0c0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
1d0d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1d0e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d0f0 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26  .    if( exact &
1d100 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c 69 74 65  & nearby<=sqlite
1d110 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1d120 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1d130 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
1d140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
1d150 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
1d160 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1d170 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
1d180 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1d190 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
1d1a0 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
1d1b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d1c0 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
1d1d0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1d1e0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
1d1f0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
1d200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
1d210 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
1d220 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1d230 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1d240 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
1d250 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
1d260 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
1d270 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
1d280 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
1d290 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
1d2a0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
1d2b0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
1d2c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d2d0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1d2e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1d2f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1d300 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d310 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1d320 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
1d330 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
1d340 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
1d350 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
1d360 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
1d370 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
1d380 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
1d390 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
1d3a0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
1d3b0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
1d3c0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
1d3d0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
1d3e0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
1d3f0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
1d400 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
1d410 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
1d420 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
1d430 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
1d440 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1d450 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1d460 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
1d470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
1d480 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1d490 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1d4a0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1d4b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1d4c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d4d0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
1d4e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1d4f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
1d500 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1d510 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1d520 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
1d530 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
1d540 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1d550 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
1d560 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
1d570 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
1d580 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
1d590 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
1d5a0 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
1d5b0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
1d5c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
1d5d0 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
1d5e0 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
1d5f0 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
1d600 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
1d610 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
1d620 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1d630 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
1d640 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1d650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d660 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1d670 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1d680 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d690 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1d6a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1d6b0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
1d6c0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
1d6d0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1d6e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1d6f0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1d700 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
1d710 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1d720 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1d730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1d740 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1d750 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1d760 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1d770 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1d780 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d790 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  k>pBt->usableSiz
1d7a0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1d7b0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
1d7c0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1d7d0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
1d7e0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1d7f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1d800 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1d810 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d820 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
1d830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d840 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1d850 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
1d860 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
1d870 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
1d880 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
1d890 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
1d8a0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
1d8b0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
1d8c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
1d8d0 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
1d8e0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
1d8f0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
1d900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d910 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
1d920 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
1d930 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1d940 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
1d950 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
1d960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d970 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1d980 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1d990 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1d9a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1d9b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1d9c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d9d0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
1d9e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1d9f0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1da00 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1da10 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1da20 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1da30 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1da40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1da50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1da60 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1da70 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1da80 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1da90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1daa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dab0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
1dac0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
1dad0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
1dae0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
1daf0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
1db00 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
1db10 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
1db20 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
1db30 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
1db40 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
1db50 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
1db60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1db70 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
1db80 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
1db90 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
1dba0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1dbb0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
1dbc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dbd0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1dbe0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
1dbf0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
1dc00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1dc10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dc20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1dc30 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1dc40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1dc50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dc60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1dc70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
1dc80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1dc90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1dcb0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1dcc0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1dcd0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1dce0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1dcf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dd00 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1dd10 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1dd20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1dd30 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
1dd40 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
1dd50 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
1dd60 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
1dd70 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1dd80 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
1dd90 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
1dda0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
1ddb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ddc0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1ddd0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1dde0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1ddf0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1de00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1de10 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1de20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1de30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1de40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1de50 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
1de60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1de70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1de80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1de90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1dea0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1deb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1dec0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1ded0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
1dee0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1def0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1df00 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1df10 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1df20 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1df30 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1df40 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1df50 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
1df60 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1df70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
1df80 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
1df90 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
1dfa0 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73        int closes
1dfb0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
1dfc0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
1dfd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
1dfe0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
1dff0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ata;.        rc 
1e000 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e010 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1e020 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1e030 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e040 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1e050 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1e060 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1e070 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
1e080 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73        int i, dis
1e090 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  t;.          clo
1e0a0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1e0b0 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62      dist = get4b
1e0c0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
1e0d0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1e0e0 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20     if( dist<0 ) 
1e0f0 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20  dist = -dist;.  
1e100 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
1e110 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
1e120 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
1e130 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1e140 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
1e150 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
1e160 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d  f( d2<0 ) d2 = -
1e170 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1e180 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
1e1a0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
1e1b0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
1e1c0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
1e1d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e1e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e1f0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1e200 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1e210 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
1e220 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1e230 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
1e240 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
1e250 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
1e260 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
1e270 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
1e280 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
1e290 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50   *pPgno>sqlite3P
1e2a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1e2b0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1e2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
1e2d0 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65  e page off the e
1e2e0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
1e2f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  /.            re
1e300 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e310 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1e320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e330 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e340 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
1e350 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
1e360 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
1e370 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
1e380 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
1e3b0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
1e3c0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
1e3d0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
1e3e0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
1e3f0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
1e400 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
1e410 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
1e420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e430 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e440 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
1e450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1e460 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1e470 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
1e480 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  o, ppPage, 1);. 
1e490 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1e4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e4b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e4c0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1e4d0 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  ck((*ppPage)->pD
1e4e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e4f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e500 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1e510 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1e520 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e530 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1e550 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1e560 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1e570 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1e580 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
1e590 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
1e5a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e5b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1e5c0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
1e5d0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1e5e0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
1e5f0 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
1e600 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1e610 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
1e620 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
1e630 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
1e640 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
1e650 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1e660 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d   */.    *pPgno =
1e670 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1e680 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1e690 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65  er) + 1;..#ifnde
1e6a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e6b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1e6c0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a   pBt->nTrunc ){.
1e6d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72        /* An incr
1e6e0 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65  -vacuum has alre
1e6f0 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74  ady run within t
1e700 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
1e710 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   So the.      **
1e720 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74   page to allocat
1e730 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68  e is not from th
1e740 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f  e physical end o
1e750 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a  f the file, but.
1e760 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d        ** at pBt-
1e770 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20  >nTrunc. .      
1e780 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  */.      *pPgno 
1e790 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b  = pBt->nTrunc+1;
1e7a0 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
1e7b0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
1e7c0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1e7d0 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
1e7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e7f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1e800 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
1e810 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50  _ISPAGE(pBt, *pP
1e820 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  gno) ){.      /*
1e830 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
1e840 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
1e850 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
1e860 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
1e870 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
1e880 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1e890 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
1e8a0 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
1e8b0 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
1e8c0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
1e8d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e8e0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
1e8f0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
1e900 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
1e910 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e920 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1e930 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
1e940 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
1e950 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  *pPgno));.      
1e960 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1e970 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e980 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
1e990 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
1e9a0 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  }.    if( pBt->n
1e9b0 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  Trunc ){.      p
1e9c0 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50  Bt->nTrunc = *pP
1e9d0 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  gno;.    }.#endi
1e9e0 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
1e9f0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1ea00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1ea10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ea20 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1ea30 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1ea40 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1ea50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ea60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ea70 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1ea80 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1ea90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1eaa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1eab0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1eac0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
1ead0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1eae0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1eaf0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
1eb00 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1eb10 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1eb20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1eb30 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
1eb40 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
1eb50 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1eb60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1eb70 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
1eb80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1eb90 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
1eba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1ebb0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1ebc0 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
1ebd0 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
1ebe0 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
1ebf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ec00 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
1ec10 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
1ec20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1ec30 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
1ec40 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1ec50 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
1ec60 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
1ec70 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
1ec80 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
1ec90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1eca0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1ecb0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1ecc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ecd0 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20  ge->pgno>1 );.  
1ece0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1ecf0 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
1ed00 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29  (pPage->pParent)
1ed10 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ;.  pPage->pPare
1ed20 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
1ed30 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1ed40 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
1ed50 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
1ed60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ed70 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1ed80 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1ed90 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20  eturn rc;.  n = 
1eda0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1edb0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1edc0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1edd0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31  ->aData[36], n+1
1ede0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1edf0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1ee00 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
1ee10 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1ee20 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1ee30 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
1ee40 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
1ee50 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
1ee60 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
1ee70 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
1ee80 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1ee90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1eea0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1eeb0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1eec0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
1eed0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1eee0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
1eef0 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
1ef00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ef10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ef20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1ef30 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
1ef40 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
1ef50 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
1ef60 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
1ef70 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1ef80 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
1ef90 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ee..  */.  if( p
1efa0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1efb0 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
1efc0 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d  pPut(pBt, pPage-
1efd0 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52  >pgno, PTRMAP_FR
1efe0 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  EEPAGE, 0);.    
1eff0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f000 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
1f010 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1f020 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1f030 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1f040 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1f050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f060 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1f070 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f080 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
1f090 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1f0a0 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
1f0b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1f0c0 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1f0d0 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
1f0e0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1f0f0 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
1f100 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
1f110 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
1f120 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
1f130 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
1f140 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
1f150 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
1f160 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
1f170 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
1f180 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
1f190 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
1f1a0 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
1f1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f1c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65  eGetPage(pBt, ge
1f1d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f1e0 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72  aData[32]), &pTr
1f1f0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
1f200 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f210 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
1f220 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1f230 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
1f240 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
1f250 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
1f260 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
1f270 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
1f280 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
1f290 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
1f2a0 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
1f2b0 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20  with no leaves. 
1f2c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1f2d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f2e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1f2f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1f300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f310 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1f320 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e  ge->aData, pTrun
1f330 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  k->pgno);.      
1f340 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f350 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
1f360 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1f370 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f380 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1f390 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  o);.        TRAC
1f3a0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1f3b0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
1f3c0 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
1f3d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f3e0 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70    pPage->pgno, p
1f3f0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
1f400 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1f410 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20   if( k<0 ){.    
1f420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1f430 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1f440 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74  {.      /* Add t
1f450 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70  he newly freed p
1f460 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e  age as a leaf on
1f470 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75   the current tru
1f480 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  nk */.      rc =
1f490 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f4a0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1f4b0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
1f4c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f4d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f4e0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1f4f0 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20  4], k+1);.      
1f500 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
1f510 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d  nk->aData[8+k*4]
1f520 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1f530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
1f540 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
1f550 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f560 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
1f570 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
1f580 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
1f590 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1f5a0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
1f5b0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
1f5c0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
1f5d0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1f5e0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1f5f0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
1f600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f610 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
1f620 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
1f630 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f640 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
1f650 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
1f660 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1f670 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
1f680 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
1f690 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1f6a0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
1f6b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
1f6c0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
1f6d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
1f6e0 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
1f6f0 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
1f700 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1f710 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1f720 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
1f730 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
1f740 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
1f750 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
1f760 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
1f770 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1f790 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
1f7a0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
1f7b0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1f7c0 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
1f7d0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1f7e0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1f7f0 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61  flow]);.  ovflPa
1f800 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
1f810 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
1f820 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
1f830 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
1f840 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
1f850 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
1f860 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
1f870 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
1f880 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
1f890 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
1f8a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
1f8b0 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  l;.    if( ovflP
1f8c0 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67  gno==0 || ovflPg
1f8d0 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1f8e0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1f8f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1f900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f910 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f920 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76  ..    rc = getOv
1f930 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1f940 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
1f950 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26  , (nOvfl==0)?0:&
1f960 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69  ovflPgno);.    i
1f970 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f980 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  c;.    rc = free
1f990 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
1f9a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f9b0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
1f9c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1f9d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f9e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f9f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
1fa00 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
1fa10 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
1fa20 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
1fa30 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
1fa40 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
1fa50 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
1fa60 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
1fa70 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
1fa80 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
1fa90 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
1faa0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
1fab0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
1fac0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
1fad0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
1fae0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1faf0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1fb00 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
1fb10 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
1fb20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
1fb30 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
1fb40 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
1fb50 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
1fb60 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
1fb70 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
1fb80 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
1fb90 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
1fba0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
1fbb0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
1fbc0 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
1fbd0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
1fbe0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1fbf0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
1fc00 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
1fc10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1fc20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fc30 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1fc40 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1fc50 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
1fc60 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
1fc70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1fc80 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1fc90 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
1fca0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
1fcb0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
1fcc0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1fcd0 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
1fce0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
1fcf0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
1fd00 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
1fd10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
1fd20 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
1fd30 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
1fd40 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
1fd70 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
1fd80 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
1fd90 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
1fda0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
1fdb0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
1fdc0 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
1fdd0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
1fde0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
1fdf0 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
1fe00 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
1fe10 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1fe20 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
1fe30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fe40 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
1fe50 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
1fe60 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
1fe70 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1fe80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fe90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1fea0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1feb0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
1fec0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
1fed0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
1fee0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1fef0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
1ff00 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
1ff10 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1ff20 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
1ff30 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
1ff40 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
1ff50 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
1ff60 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
1ff70 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
1ff80 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
1ff90 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
1ffa0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
1ffb0 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
1ffc0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
1ffd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1ffe0 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
1fff0 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
20000 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
20010 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
20020 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
20030 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
20040 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
20050 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
20060 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
20070 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
20080 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
20090 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
200a0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
200b0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
200c0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
200d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
200e0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
200f0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
20100 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
20110 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
20120 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
20130 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
20140 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
20150 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
20160 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
20170 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
20180 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
20190 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
201a0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
201b0 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
201c0 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
201d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
201e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
201f0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
20200 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
20210 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
20220 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
20230 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
20240 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
20250 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
20260 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
20270 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
20280 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
20290 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
202a0 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
202b0 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
202c0 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
202d0 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
202e0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
202f0 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
20300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
20310 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
20320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
20330 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
20340 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20350 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
20360 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
20370 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
20380 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20390 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
203a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
203b0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
203c0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
203d0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
203e0 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
203f0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
20400 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
20410 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
20420 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
20430 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
20440 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
20450 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
20460 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
20470 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
20480 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
20490 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
204a0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
204b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
204c0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
204d0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
204e0 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
204f0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
20500 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
20510 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
20520 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
20530 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
20540 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
20550 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
20560 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
20570 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
20580 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
20590 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
205a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
205b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
205c0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
205d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
205e0 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
205f0 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
20600 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
20610 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
20620 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
20630 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
20640 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
20650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
20660 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
20670 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
20680 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20690 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
206a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
206b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
206c0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
206d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
206e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
206f0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
20700 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
20710 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
20720 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
20730 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
20740 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
20750 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
20760 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
20770 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
20780 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
20790 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
207a0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
207b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
207c0 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
207d0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
207e0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
207f0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
20800 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ;.    if( nSrc>0
20810 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
20820 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
20830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20840 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
20850 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
20860 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
20870 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
20880 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
20890 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
208a0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
208b0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
208c0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
208d0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
208e0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
208f0 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
20900 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
20910 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
20920 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
20930 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
20940 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
20950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20960 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
20970 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
20980 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
20990 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
209a0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
209b0 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
209c0 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
209d0 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
209e0 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
209f0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
20a00 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
20a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
20a20 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
20a30 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
20a40 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
20a50 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
20a60 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
20a70 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  his;.  DbPage *p
20a80 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
20a90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20aa0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
20ab0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20ac0 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
20ad0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
20ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20af0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
20b00 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
20b10 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
20b20 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
20b30 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
20b40 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
20b50 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
20b60 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
20b70 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
20b80 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
20b90 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
20ba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20bb0 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  This->aData==sql
20bc0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
20bd0 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  (pDbPage) );.   
20be0 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
20bf0 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
20c00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
20c10 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
20c20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
20c30 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
20c40 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
20c50 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
20c60 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
20c70 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
20c80 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
20c90 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
20ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
20cb0 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
20cc0 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
20cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20ce0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
20cf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20d00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20d10 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
20d20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65  Vacuum ){.    re
20d30 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
20d40 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  Bt, pgno, PTRMAP
20d50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65  _BTREE, pNewPare
20d60 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23  nt->pgno);.  }.#
20d70 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
20d80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
20d90 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
20da0 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
20db0 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
20dc0 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e  of pPage to poin
20dd0 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61  t back.** to pPa
20de0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ge..**.** In oth
20df0 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76  er words, for ev
20e00 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ery child of pPa
20e10 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72  ge, invoke repar
20e20 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20  entPage().** to 
20e30 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65  make sure that e
20e40 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20  ach child knows 
20e50 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74  that pPage is it
20e60 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  s parent..**.** 
20e70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
20e80 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79  s called after y
20e90 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20  ou memcpy() one 
20ea0 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f  page into.** ano
20eb0 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
20ec0 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c  int reparentChil
20ed0 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  dPages(MemPage *
20ee0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
20ef0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20f00 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
20f10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20f20 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
20f30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
20f40 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
20f50 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
20f60 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74  Page->leaf ) ret
20f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
20f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
20f90 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
20fa0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
20fb0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
20fc0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50   i);.    if( !pP
20fd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20fe0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
20ff0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
21000 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
21010 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
21020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21030 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21040 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
21050 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
21060 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65  c = reparentPage
21070 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
21080 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
21090 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
210a0 29 2c 20 0a 20 20 20 20 20 20 20 70 50 61 67 65  ), .       pPage
210b0 2c 20 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  , i);.    pPage-
210c0 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
210d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
210e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
210f0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
21100 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
21110 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
21120 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
21130 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
21140 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
21150 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
21160 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
21170 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
21180 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
21190 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
211a0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
211b0 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
211c0 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
211d0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
211e0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
211f0 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
21200 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
21210 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
21220 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
21230 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
21240 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
21250 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
21260 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21270 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
21280 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
21290 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
212a0 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
212b0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
212c0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
212d0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
212e0 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
212f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
21300 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
21310 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
21320 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
21330 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
21340 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
21350 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
21360 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
21370 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
21380 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
21390 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
213a0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
213b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
213c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
213d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
213e0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
213f0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
21400 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
21410 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
21420 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
21430 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63  r);.  assert( pc
21440 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50  >10 && pc+sz<=pP
21450 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
21460 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70  Size );.  freeSp
21470 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
21480 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b  z);.  for(i=idx+
21490 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
214a0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
214b0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
214c0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
214d0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
214e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
214f0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
21500 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
21510 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
21520 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
21530 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61  Free += 2;.  pPa
21540 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
21550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
21560 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
21570 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
21580 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
21590 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
215a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
215b0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
215c0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
215d0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
215e0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
215f0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
21600 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
21610 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
21620 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
21630 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
21640 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
21650 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
21660 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
21670 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
21680 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
21690 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
216a0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
216b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
216c0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
216d0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
216e0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
216f0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
21700 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
21710 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
21720 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
21730 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
21740 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
21750 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
21760 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
21770 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
21780 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
21790 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
217a0 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
217b0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
217c0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
217d0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
217e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
217f0 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
21800 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
21810 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
21820 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
21830 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
21840 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
21850 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
21860 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
21870 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
21880 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
21890 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
218a0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
218b0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
218c0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
218d0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
218e0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
218f0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
21900 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
21910 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
21920 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
21930 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
21940 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
21950 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
21960 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
21970 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
21980 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
21990 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
219a0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
219b0 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
219c0 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
219d0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
219e0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
219f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
21a00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
21a10 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
21a20 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
21a30 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
21a40 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
21a50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21a60 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
21a70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
21a80 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
21a90 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
21aa0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
21ab0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
21ac0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
21ad0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
21ae0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
21af0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
21b00 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
21b10 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
21b20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
21b30 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
21b40 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
21b50 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
21b60 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
21b70 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
21b80 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
21b90 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
21ba0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
21bb0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
21bc0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
21bd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
21be0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
21bf0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
21c00 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
21c10 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
21c20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
21c30 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
21c40 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
21c50 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
21c60 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
21c70 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
21c80 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
21c90 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
21ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
21cb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21cc0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
21cd0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
21ce0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
21cf0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
21d00 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
21d10 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
21d20 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
21d30 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
21d40 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
21d50 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
21d60 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
21d70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
21d80 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a     assert( j<siz
21d90 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
21da0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
21db0 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20  aOvfl[0]) );.   
21dc0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
21dd0 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
21de0 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
21df0 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20  [j].idx = i;.   
21e00 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
21e10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21e20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
21e30 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
21e40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21e50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21e60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
21e70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
21e80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
21e90 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
21ea0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
21eb0 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
21ec0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
21ed0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
21ee0 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
21ef0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
21f00 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
21f10 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
21f20 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
21f30 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
21f40 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
21f50 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
21f60 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
21f70 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
21f80 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
21f90 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
21fa0 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
21fb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
21fc0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21fd0 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20  n rc;.      top 
21fe0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
21ff0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
22000 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a  assert( end + sz
22010 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d   <= top );.    }
22020 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63  .    idx = alloc
22030 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
22040 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sz);.    assert(
22050 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73   idx>0 );.    as
22060 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74  sert( end <= get
22070 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
22080 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  5]) );.    pPage
22090 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
220a0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
220b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
220c0 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
220d0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
220e0 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
220f0 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
22100 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
22110 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
22120 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
22130 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
22140 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
22150 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
22160 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
22170 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
22180 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
22190 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
221a0 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
221b0 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
221c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
221d0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
221e0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
221f0 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
22200 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
22210 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
22220 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
22230 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
22240 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
22250 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
22260 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
22270 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
22280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c      */.      Cel
22290 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
222a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
222b0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
222c0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
222d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
222e0 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
222f0 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
22300 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
22310 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20  ayload );.      
22320 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
22330 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
22340 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
22350 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
22360 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
22370 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
22380 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
22390 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ow]);.        rc
223a0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
223b0 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
223c0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
223d0 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
223e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
223f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
22400 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
22410 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
22420 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
22430 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22440 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
22450 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
22460 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
22470 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
22480 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
22490 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
224a0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
224b0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
224c0 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
224d0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
224e0 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
224f0 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
22500 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
22510 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
22520 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
22530 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
22540 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
22550 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
22560 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
22570 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  bodies */.  int 
22580 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
22590 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
225a0 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
225b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
225c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
225d0 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
225e0 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
225f0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
22600 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
22610 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
22620 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
22630 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
22640 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
22650 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
22660 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
22670 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
22680 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
22690 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
226a0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
226b0 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
226c0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
226d0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
226e0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
226f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
22700 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
22710 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
22720 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
22730 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
22740 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
22750 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
22760 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
22770 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
22780 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
22790 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
227a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
227b0 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
227c0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
227d0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
227e0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
227f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22800 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
22810 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
22820 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
22830 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
22840 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
22850 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
22860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
22870 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
22880 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
22890 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
228a0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
228b0 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
228c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
228d0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
228e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
228f0 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
22900 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
22910 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
22920 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
22930 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
22940 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
22950 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
22960 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
22970 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
22980 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
22990 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
229a0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
229b0 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  ll = nCell;.}../
229c0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
229d0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
229e0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
229f0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
22a00 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
22a10 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
22a20 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
22a30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
22a40 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
22a50 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
22a60 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
22a70 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
22a80 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
22a90 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
22aa0 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
22ab0 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
22ac0 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
22ad0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
22ae0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
22af0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
22b00 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
22b10 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
22b20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
22b30 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
22b40 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
22b50 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
22b60 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
22b70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
22b80 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
22b90 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
22ba0 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
22bb0 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
22bc0 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
22bd0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
22be0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
22bf0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
22c00 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
22c10 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
22c20 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c40 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
22c50 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
22c60 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
22c70 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
22c80 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
22c90 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
22ca0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
22cb0 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
22cc0 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
22cd0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
22ce0 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23  mPage*, int);..#
22cf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22d00 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
22d10 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
22d20 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
22d30 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
22d40 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
22d50 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
22d60 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
22d70 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
22d80 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
22d90 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
22da0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
22db0 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
22dc0 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
22dd0 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
22de0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
22df0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
22e00 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65  f trying balance
22e10 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
22e20 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
22e30 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
22e40 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
22e50 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
22e60 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
22e70 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
22e80 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
22e90 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
22ea0 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
22eb0 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
22ec0 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
22ed0 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
22ee0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
22ef0 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
22f00 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
22f10 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
22f20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
22f30 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
22f40 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
22f50 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
22f60 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
22f70 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
22f80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
22f90 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
22fa0 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
22fb0 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
22fc0 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
22fd0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
22fe0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
22ff0 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
23000 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
23010 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
23020 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
23030 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
23040 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
23050 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
23060 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
23070 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20   Pgno pgnoNew;. 
23080 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e   u8 *pCell;.  in
23090 74 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c  t szCell;.  Cell
230a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53  Info info;.  BtS
230b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
230c0 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70  ge->pBt;.  int p
230d0 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65  arentIdx = pPare
230e0 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20  nt->nCell;   /* 
230f0 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69  pParent new divi
23100 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  der cell index *
23110 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69  /.  int parentSi
23120 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
23130 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
23140 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
23150 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74  l */.  u8 parent
23160 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20  Cell[64];       
23170 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
23180 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69  e for the new di
23190 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20  vider cell */.. 
231a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
231b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
231c0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
231d0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
231e0 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73   a new page. Ins
231f0 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ert the overflow
23200 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
23210 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54  .  ** into it. T
23220 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  hen remove the o
23230 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
23240 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  m pPage..  */.  
23250 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
23260 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
23270 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
23280 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
23290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
232a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
232b0 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
232c0 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
232d0 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
232e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
232f0 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ll);.  zeroPage(
23300 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61  pNew, pPage->aDa
23310 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62  ta[0]);.  assemb
23320 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
23330 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
23340 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
23350 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  flow = 0;..  /* 
23360 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f  Set the parent o
23370 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  f the newly allo
23380 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70 50  cated page to pP
23390 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77  arent. */.  pNew
233a0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
233b0 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ent;.  sqlite3Pa
233c0 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
233d0 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  pDbPage);..  /* 
233e0 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e 74  pPage is current
233f0 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  ly the right-chi
23400 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43  ld of pParent. C
23410 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20  hange this.  ** 
23420 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
23430 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
23440 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
23450 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a  d above and.  **
23460 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
23470 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
23480 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d. .  */.  asser
23490 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
234a0 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  0 );.  pCell = f
234b0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
234c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
234d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
234e0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
234f0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
23500 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
23510 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
23520 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e  ntCell, 0, info.
23530 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
23540 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69  parentSize);.  i
23550 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23560 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
23570 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
23580 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29   parentSize<64 )
23590 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  ;.  rc = insertC
235a0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
235b0 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65  entIdx, parentCe
235c0 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20  ll, parentSize, 
235d0 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 4);.  if( rc!
235e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
235f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
23600 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64  .  put4byte(find
23610 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
23620 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
23630 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
23640 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
23650 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
23660 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
23670 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e   pgnoNew);..#ifn
23680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23690 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
236a0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
236b0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
236c0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
236d0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20  ointer map.  ** 
236e0 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
236f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
23700 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
23710 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65  rom the .  ** ce
23720 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
23730 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
23740 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
23750 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23760 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
23770 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
23780 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
23790 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
237a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
237b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
237c0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
237d0 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
237e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
237f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
23810 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
23820 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
23830 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c  #endif..  /* Rel
23840 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
23850 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
23860 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74  ge and balance t
23870 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a  he parent page,.
23880 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
23890 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
238a0 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74  serted caused it
238b0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
238c0 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ull..  */.  rele
238d0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
238e0 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28   return balance(
238f0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23  pParent, 0);.}.#
23900 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
23910 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
23920 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
23930 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
23940 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20  ibutes Cells on 
23950 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
23960 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  NN*2 siblings.**
23970 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61   of pPage so tha
23980 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
23990 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20   about the same 
239a0 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
239b0 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  pace..** Usually
239c0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
239d0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
239e0 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20  Page is used in 
239f0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a  the balancing,.*
23a00 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69  * though more si
23a10 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
23a20 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20  e from one side 
23a30 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
23a40 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74  first.** or last
23a50 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
23a60 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20  rent.  If pPage 
23a70 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
23a80 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  *NN siblings.** 
23a90 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
23aa0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23ab0 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
23ac0 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
23ad0 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f  .** child of roo
23ae0 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  t) then all avai
23af0 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70  lable siblings p
23b00 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
23b10 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
23b20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
23b30 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
23b40 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
23b50 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
23b60 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20  ed by one or.** 
23b70 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
23b80 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
23b90 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
23ba0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68  ot over full. Th
23bb0 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
23bc0 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73  s special and is
23bd0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e   allowed to be n
23be0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20  early empty. If 
23bf0 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65  pPage is .** the
23c00 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
23c10 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
23c20 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20  e tree might be 
23c30 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20  increased.** or 
23c40 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
23c50 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20  , as necessary, 
23c60 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74  to keep the root
23c70 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
23c80 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  .** overfull or 
23c90 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
23ca0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
23cb0 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
23cc0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
23cd0 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73  ome of the Cells
23ce0 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   on pPage.** mig
23cf0 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
23d00 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  be stored in pPa
23d10 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68  ge->aData[].  Th
23d20 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
23d30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
23d40 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20  overfull.  Part 
23d50 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68  of the job of th
23d60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
23d70 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  .** make sure al
23d80 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67  l Cells for pPag
23d90 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74  e once again fit
23da0 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
23db0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  []..**.** In the
23dc0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
23dd0 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67  cing the sibling
23de0 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20  s of pPage, the 
23df0 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a  parent of pPage.
23e00 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  ** might become 
23e10 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
23e20 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20  rfull.  If that 
23e30 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68  happens, then th
23e40 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
23e50 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
23e60 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ely on the paren
23e70 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
23e80 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
23e90 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
23ea0 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
23eb0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
23ec0 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
23ed0 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  te.  So if this 
23ee0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
23ef0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
23f00 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
23f10 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
23f20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
23f30 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  oot(MemPage *pPa
23f40 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
23f50 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
23f60 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
23f70 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  t of pPage */.  
23f80 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23fa0 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
23fb0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
23fc0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
23fd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23fe0 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
23ff0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
24000 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
24010 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
24020 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
24030 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
24040 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b  . */.  int nOld;
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24070 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
24080 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  ] */.  int nNew;
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
240b0 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
240c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b  ] */.  int nDiv;
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
240f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b   cells in apDiv[
24100 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
24110 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
24120 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
24130 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ters */.  int id
24140 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
24150 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24160 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72  of pPage in pPar
24170 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
24180 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241a0 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
241b0 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
241c0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
241d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
241e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
241f0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
24200 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
24210 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
24220 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
24230 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
24240 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
24250 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
24260 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
24270 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
24280 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
24290 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
242a0 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
242b0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
242c0 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
242d0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
242e0 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
242f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
24300 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
24310 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
24320 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
24330 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
24340 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
24350 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
24360 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
24370 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
24380 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
24390 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
243a0 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ce[] */.  MemPag
243b0 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
243c0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
243d0 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
243e0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  blings */.  Pgno
243f0 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20   pgnoOld[NB];   
24400 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
24410 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
24420 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b  h page in apOld[
24430 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
24440 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
24450 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
24460 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
24470 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
24480 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
24490 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
244a0 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
244b0 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
244c0 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e  lancing */.  Pgn
244d0 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b  o pgnoNew[NB+2];
244e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
244f0 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61  e numbers for ea
24500 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77  ch page in apNew
24510 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  [] */.  u8 *apDi
24520 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  v[NB];          
24530 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
24540 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
24550 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
24560 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
24570 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
24580 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
24590 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
245a0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
245b0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
245c0 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
245d0 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
245e0 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
245f0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
24600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24610 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
24620 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
24630 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24650 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
24660 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
24670 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43  ll[] */.  u8 *aC
24680 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
24690 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
246a0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  for holding data
246b0 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a   of apCopy[] */.
246c0 20 20 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20    u8 *aSpace;   
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
246e0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
246f0 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
24700 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e  rs cells */.#ifn
24710 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24720 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20  AUTOVACUUM.  u8 
24730 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64  *aFrom = 0;.#end
24740 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  if..  assert( sq
24750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24760 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
24770 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ex) );..  /* .  
24780 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
24790 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
247a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
247b0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
247c0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
247d0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
247e0 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50  ->pDbPage) || pP
247f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
24800 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  1 );.  pBt = pPa
24810 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65  ge->pBt;.  pPare
24820 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
24830 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
24840 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20  Parent );.  if( 
24850 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
24860 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24870 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  te(pParent->pDbP
24880 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  age)) ){.    ret
24890 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52  urn rc;.  }.  TR
248a0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
248b0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
248c0 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
248d0 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
248e0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
248f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24900 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
24910 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
24920 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
24930 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
24940 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
24950 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
24960 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
24970 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
24980 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
24990 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
249a0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
249b0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
249c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
249d0 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
249e0 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
249f0 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
24a00 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
24a10 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
24a20 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
24a30 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
24a40 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
24a50 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
24a60 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
24a70 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
24a80 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
24a90 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
24aa0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
24ab0 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
24ac0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
24ad0 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
24ae0 74 61 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ta &&.      pPag
24af0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
24b00 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
24b10 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50  aOvfl[0].idx==pP
24b20 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20  age->nCell &&.  
24b30 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
24b40 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
24b50 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
24b60 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
24b70 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
24b80 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
24b90 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  o.  ){.    /*.  
24ba0 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
24bb0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
24bc0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
24bd0 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
24be0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
24bf0 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
24c00 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
24c10 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
24c20 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
24c30 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20  ce_quick(pPage, 
24c40 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65  pParent);.  }.#e
24c50 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49  ndif..  if( SQLI
24c60 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
24c70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24c80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
24c90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24ca0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
24cb0 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69   Find the cell i
24cc0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
24cd0 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69  e whose left chi
24ce0 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20  ld points back. 
24cf0 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54   ** to pPage.  T
24d00 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c  he "idx" variabl
24d10 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  e is the index o
24d20 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66  f that cell.  If
24d30 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74   pPage.  ** is t
24d40 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69  he rightmost chi
24d50 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68  ld of pParent th
24d60 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50  en set idx to pP
24d70 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20  arent->nCell .  
24d80 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
24d90 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20  ->idxShift ){.  
24da0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
24db0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
24dc0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
24dd0 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61   pgno==sqlite3Pa
24de0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
24df0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
24e00 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20  .    for(idx=0; 
24e10 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
24e20 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  ll; idx++){.    
24e30 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66    if( get4byte(f
24e40 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
24e50 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a   idx))==pgno ){.
24e60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24e80 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
24e90 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  rent->nCell.    
24ea0 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34           || get4
24eb0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
24ec0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
24ed0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e  rOffset+8])==pgn
24ee0 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o );.  }else{.  
24ef0 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69    idx = pPage->i
24f00 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20  dxParent;.  }.. 
24f10 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c   /*.  ** Initial
24f20 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ize variables so
24f30 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
24f40 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20   safe to jump.  
24f50 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62  ** directly to b
24f60 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61  alance_cleanup a
24f70 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t any moment..  
24f80 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77  */.  nOld = nNew
24f90 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
24fa0 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
24fb0 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  >pDbPage);..  /*
24fc0 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69  .  ** Find sibli
24fd0 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67  ng pages to pPag
24fe0 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20  e and the cells 
24ff0 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20  in pParent that 
25000 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20  divide.  ** the 
25010 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74  siblings.  An at
25020 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
25030 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
25040 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a  s on either.  **
25050 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
25060 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
25070 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
25080 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
25090 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74   if.  ** pPage t
250a0 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
250b0 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
250c0 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
250d0 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20  e.  If pParent. 
250e0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
250f0 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
25100 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
25110 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
25120 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69  ken..  */.  nxDi
25130 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20  v = idx - NN;.  
25140 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e  if( nxDiv + NB >
25150 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
25160 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70  ){.    nxDiv = p
25170 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20  Parent->nCell - 
25180 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66  NB + 1;.  }.  if
25190 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20  ( nxDiv<0 ){.   
251a0 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a   nxDiv = 0;.  }.
251b0 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f    nDiv = 0;.  fo
251c0 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20  r(i=0, k=nxDiv; 
251d0 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  i<NB; i++, k++){
251e0 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65  .    if( k<pPare
251f0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
25200 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
25210 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
25220 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b  k);.      nDiv++
25230 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25240 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29  !pParent->leaf )
25250 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  ;.      pgnoOld[
25260 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  i] = get4byte(ap
25270 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c  Div[i]);.    }el
25280 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e  se if( k==pParen
25290 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
252a0 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
252b0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
252c0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
252d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
252e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
252f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25300 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
25310 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f  tPage(pBt, pgnoO
25320 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d  ld[i], &apOld[i]
25330 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , pParent);.    
25340 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
25350 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
25360 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78     apOld[i]->idx
25370 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20  Parent = k;.    
25380 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20  apCopy[i] = 0;. 
25390 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f     assert( i==nO
253a0 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b  ld );.    nOld++
253b0 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  ;.    nMaxCells 
253c0 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
253d0 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
253e0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20  Overflow;.  }.. 
253f0 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
25400 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
25410 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   2 in order to p
25420 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
25430 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
25440 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
25450 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e  nMaxCells + 1)&~
25460 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  1;..  /*.  ** Al
25470 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
25480 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
25490 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  es.  */.  apCell
254a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
254b0 63 28 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  c( .       nMaxC
254c0 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
254f0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
25500 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
25510 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 20  int)            
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25530 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
25540 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
25550 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20  (MemPage))*NB   
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25570 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20     /* aCopy */. 
25580 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
25590 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20  ize*(5+NB)      
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255b0 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20        /* aSpace 
255c0 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54  */.     + (ISAUT
255d0 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65  OVACUUM ? nMaxCe
255e0 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20 20 20  lls : 0)        
255f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
25600 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  om */.  );.  if(
25610 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
25620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
25630 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
25640 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
25650 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69   }.  szCell = (i
25660 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  nt*)&apCell[nMax
25670 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
25680 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
25690 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
256a0 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
256b0 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
256c0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
256d0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
256e0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
256f0 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
25700 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
25710 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
25720 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
25730 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
25740 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
25750 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
25760 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
25770 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
25780 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
25790 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
257a0 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42  pace = &aCopy[NB
257b0 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
257c0 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
257d0 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73  MemPage))];.  as
257e0 73 65 72 74 28 20 28 28 61 53 70 61 63 65 20 2d  sert( ((aSpace -
257f0 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
25800 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
25810 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
25820 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  uired */.#ifndef
25830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25840 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
25850 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
25860 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
25870 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65  pace[5*pBt->page
25880 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Size];.  }.#endi
25890 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  f.  .  /*.  ** M
258a0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
258b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
258c0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
258d0 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
258e0 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
258f0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
25900 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
25910 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
25920 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
25930 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
25940 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
25950 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
25960 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
25970 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
25980 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
25990 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
259a0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
259b0 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
259c0 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
259d0 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
259e0 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
259f0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
25a00 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
25a10 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
25a20 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
25a30 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
25a40 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
25a50 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
25a60 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
25a70 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
25a80 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
25a90 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
25aa0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
25ab0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
25ac0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
25ad0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
25ae0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
25af0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
25b00 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
25b10 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
25b20 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
25b30 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
25b40 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
25b50 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
25b60 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
25b70 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
25b80 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
25b90 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
25ba0 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
25bb0 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
25bc0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
25bd0 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
25be0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
25bf0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
25c00 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
25c10 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
25c20 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
25c30 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
25c40 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
25c50 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
25c60 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
25c70 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
25c80 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
25c90 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
25ca0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
25cb0 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
25cc0 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
25cd0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
25ce0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
25cf0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
25d00 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
25d10 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
25d20 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
25d30 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
25d40 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
25d50 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
25d60 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
25d70 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
25d80 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
25d90 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
25da0 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
25db0 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
25dc0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
25dd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
25de0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
25df0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
25e00 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
25e10 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
25e20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
25e30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
25e40 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
25e50 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
25e60 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
25e70 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
25e80 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
25e90 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
25ea0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
25eb0 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
25ec0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25ed0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25ee0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
25ef0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25f00 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
25f10 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
25f20 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
25f30 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
25f40 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
25f50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
25f60 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
25f70 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
25f80 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
25f90 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
25fa0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
25fb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25fd0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25fe0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
25ff0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
26000 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ld-1 ){.      in
26010 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  t sz = cellSizeP
26020 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
26030 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
26040 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
26050 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
26060 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
26070 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
26080 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
26090 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
260a0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
260b0 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
260c0 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
260d0 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
260e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
260f0 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
26100 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
26110 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
26120 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
26130 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
26140 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
26150 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
26160 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
26170 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26180 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
26190 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
261a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
261b0 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
261c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
261d0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
261e0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
261f0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
26200 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
26210 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
26220 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
26230 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
26240 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
26250 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
26260 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
26270 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
26280 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
26290 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
262a0 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
262b0 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  tion;.#ifndef SQ
262c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
262d0 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
262e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
262f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
26300 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
26310 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  F;.        }.#en
26320 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70  dif.        drop
26330 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
26340 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
26350 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
26360 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
26370 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
26380 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
26390 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
263a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
263b0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
263c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
263d0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
263e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
263f0 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
26400 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
26410 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
26420 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
26430 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
26440 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
26450 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
26460 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
26470 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
26480 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
26490 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
264a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
264b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
264c0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
264d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
264e0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
264f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
26500 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
26510 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
26520 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
26530 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  /.            sz
26540 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
26550 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
26570 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
26580 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
26590 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
265a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
265b0 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
265c0 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
265d0 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
265e0 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
265f0 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
26600 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
26610 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
26620 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
26630 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
26640 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
26650 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
26660 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
26670 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
26680 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
26690 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
266a0 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
266b0 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
266c0 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
266d0 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
266e0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
266f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
26700 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
26710 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
26720 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
26730 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
26740 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
26750 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
26760 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
26770 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
26780 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
26790 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
267a0 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
267b0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
267c0 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
267d0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
267e0 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
267f0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
26800 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
26810 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
26820 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
26830 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
26840 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
26850 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
26860 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
26870 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
26880 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
26890 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
268a0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
268b0 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
268c0 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
268d0 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
268e0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
268f0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
26900 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
26910 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
26920 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
26930 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
26940 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
26950 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
26960 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
26970 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
26980 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
26990 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
269a0 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
269b0 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
269c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
269d0 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
269e0 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
269f0 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
26a00 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
26a10 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
26a20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
26a30 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
26a40 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
26a50 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
26a60 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
26a70 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
26a80 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
26a90 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
26aa0 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
26ab0 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
26ac0 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
26ad0 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
26ae0 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
26af0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
26b00 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
26b10 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
26b20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
26b30 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
26b40 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
26b50 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
26b60 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
26b70 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
26b80 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
26b90 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
26ba0 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
26bb0 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
26bc0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
26bd0 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
26be0 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
26bf0 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
26c00 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
26c10 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
26c20 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
26c30 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
26c40 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
26c50 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
26c60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
26c70 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
26c80 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
26c90 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
26ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26cb0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
26cc0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
26cd0 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
26ce0 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
26cf0 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
26d00 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
26d10 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
26d20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
26d30 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
26d40 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
26d50 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
26d60 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
26d70 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
26d80 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
26d90 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
26da0 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
26db0 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
26dc0 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
26dd0 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
26de0 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
26df0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
26e00 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
26e10 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
26e20 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
26e30 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
26e40 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
26e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
26e60 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
26e70 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
26e80 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
26e90 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
26ea0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
26eb0 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
26ec0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
26ed0 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
26ee0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
26ef0 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
26f00 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
26f10 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
26f20 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
26f30 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
26f40 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
26f50 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
26f60 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
26f70 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
26f80 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
26f90 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
26fa0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
26fb0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
26fc0 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
26fd0 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
26fe0 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
26ff0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
27000 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
27010 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
27020 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
27030 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
27040 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
27050 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
27060 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
27070 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
27080 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27090 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
270a0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
270b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
270c0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
270d0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
270e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
270f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
27100 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
27110 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
27120 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
27130 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
27140 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27150 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
27160 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
27170 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
27180 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nNew++;.    }.  
27190 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
271a0 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d   pageFlags);.  }
271b0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
271c0 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
271d0 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
271e0 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
271f0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
27200 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  d ){.    rc = fr
27210 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  eePage(apOld[i])
27220 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
27230 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27240 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
27250 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
27260 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
27270 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
27280 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
27290 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
272a0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
272b0 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
272c0 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
272d0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
272e0 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
272f0 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
27300 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
27310 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
27320 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
27330 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
27340 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
27350 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
27360 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
27370 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
27380 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
27390 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
273a0 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
273b0 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
273c0 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
273d0 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
273e0 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
273f0 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
27400 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
27410 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
27420 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
27430 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
27440 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
27450 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
27460 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
27470 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
27480 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
27490 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
274a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
274b0 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
274c0 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
274d0 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  i];.    int minI
274e0 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
274f0 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
27500 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65        if( pgnoNe
27510 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d  w[j]<(unsigned)m
27520 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
27530 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
27540 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
27550 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
27560 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
27570 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
27580 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
27590 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67  pT;.      t = pg
275a0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  noNew[i];.      
275b0 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
275c0 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
275d0 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b  = pgnoNew[minI];
275e0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
275f0 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
27600 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e       pgnoNew[min
27610 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70  I] = t;.      ap
27620 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
27630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
27640 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
27650 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a  : %d %d %d  new:
27660 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
27670 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
27680 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f  %d)\n",.    pgno
27690 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c  Old[0], .    nOl
276a0 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31  d>=2 ? pgnoOld[1
276b0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  ] : 0,.    nOld>
276c0 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20  =3 ? pgnoOld[2] 
276d0 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77  : 0,.    pgnoNew
276e0 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  [0], szNew[0],. 
276f0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e     nNew>=2 ? pgn
27700 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[1] : 0, nNe
27710 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
27720 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
27730 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20   ? pgnoNew[2] : 
27740 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
27750 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
27760 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77  New>=4 ? pgnoNew
27770 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  [3] : 0, nNew>=4
27780 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
27790 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70  .    nNew>=5 ? p
277a0 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e  gnoNew[4] : 0, n
277b0 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
277c0 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20  ] : 0));..  /*. 
277d0 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
277e0 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
277f0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
27800 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
27810 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
27820 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
27830 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
27840 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
27850 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
27860 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
27870 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
27880 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
27890 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
278a0 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
278b0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
278c0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
278d0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
278e0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69  >pgno==pgnoNew[i
278f0 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  ] );.    assembl
27900 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
27910 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
27920 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
27930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
27940 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
27950 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
27960 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
27970 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
27980 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23  verflow==0 );..#
27990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
279a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
279b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
279c0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
279d0 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
279e0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
279f0 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74  entries.    ** t
27a00 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  hat point to the
27a10 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
27a20 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20  ere rearranged. 
27a30 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65  These can be: le
27a40 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72  ft.    ** childr
27a50 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65  en of cells, the
27a60 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
27a70 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65  the page, or ove
27a80 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
27a90 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
27aa0 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   cells..    */. 
27ab0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
27ac0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
27ad0 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65  for(k=j; k<cntNe
27ae0 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  w[i]; k++){.    
27af0 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d      assert( k<nM
27b00 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
27b10 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d     if( aFrom[k]=
27b20 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
27b30 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[k]]->pgno!
27b40 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
27b50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
27b60 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
27b70 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20  , k-j);.        
27b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27ba0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
27bb0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
27bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27bd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
27be0 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74  dif..    j = cnt
27bf0 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
27c00 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
27c10 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
27c20 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
27c30 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
27c40 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
27c50 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
27c60 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
27c70 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
27c80 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
27c90 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
27ca0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
27cb0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
27cc0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
27cd0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
27ce0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
27cf0 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
27d00 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
27d10 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
27d20 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
27d30 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
27d40 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
27d50 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
27d60 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
27d70 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
27d80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
27d90 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
27da0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
27db0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
27dc0 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
27dd0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
27de0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
27df0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
27e00 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
27e10 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
27e20 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
27e30 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
27e40 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
27e50 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
27e60 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
27e70 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
27e80 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
27e90 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
27ea0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
27eb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27ec0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27ed0 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
27ee0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
27ef0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
27f00 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
27f10 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
27f20 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69  Cell = &aSpace[i
27f30 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
27f40 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
27f50 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
27f60 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
27f70 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
27f80 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
27f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
27fa0 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
27fb0 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
27fc0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
27fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27fe0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
27ff0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
28000 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20  pace[iSpace];.  
28010 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
28020 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
28030 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
28040 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
28050 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
28060 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
28070 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
28080 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
28090 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
280a0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
280b0 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
280c0 6e 6f 64 65 2c 20 61 6e 64 20 69 74 27 73 20 72  node, and it's r
280d0 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
280e0 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
280f0 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
28100 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
28110 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
28120 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
28130 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
28140 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
28150 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
28160 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
28170 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
28180 20 42 75 74 20 69 74 27 73 20 69 6d 70 6f 72 74   But it's import
28190 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20  ant to pass the 
281a0 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20  correct size to 
281b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65  .        ** inse
281c0 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70  rtCell(), so rep
281d0 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f  arse the cell no
281e0 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  w..        **.  
281f0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
28200 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65  at this can neve
28210 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53  r happen in an S
28220 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c  QLite data file,
28230 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20   as all.        
28240 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20  ** cells are at 
28250 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49  least 4 bytes. I
28260 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  t only happens i
28270 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20  n b-trees used. 
28280 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61         ** to eva
28290 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43  luate "IN (SELEC
282a0 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69  T ...)" and simi
282b0 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20  lar clauses..   
282c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
282d0 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34  if( szCell[j]==4
282e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
282f0 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74  sert(leafCorrect
28300 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20  ion==4);.       
28310 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
28320 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65  Ptr(pParent, pCe
28330 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
28340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
28350 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
28360 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
28370 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34  ll, sz, pTemp, 4
28380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
28390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
283a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
283b0 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  p;.      put4byt
283c0 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
283d0 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
283e0 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
283f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28400 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
28410 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
28420 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
28430 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20  m database, and 
28440 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20  not a leaf-data 
28450 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  tree,.      ** t
28460 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70  hen update the p
28470 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20  ointer map with 
28480 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
28490 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
284a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
284b0 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72   cell just inser
284c0 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69  ted points to (i
284d0 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
284e0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
284f0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c  autoVacuum && !l
28500 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
28510 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28520 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tOvfl(pParent, n
28530 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  xDiv);.        i
28540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
28560 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28570 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
28580 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28590 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
285a0 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Div++;.    }.  }
285b0 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
285c0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
285d0 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
285e0 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
285f0 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
28600 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
28610 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  {.    memcpy(&ap
28620 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
28630 74 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e  ta[8], &apCopy[n
28640 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
28650 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 4);.  }.  if( 
28660 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
28670 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e  nCell+pParent->n
28680 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
28690 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
286a0 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67  bling is the rig
286b0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ht-most child of
286c0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20   pParent */.    
286d0 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
286e0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
286f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
28700 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
28710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28720 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
28730 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74  ling is the left
28740 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69   child of the fi
28750 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61  rst entry in pPa
28760 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74  rent.    ** past
28770 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
28780 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f  divider entry */
28790 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69  .    put4byte(fi
287a0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
287b0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20  Parent, nxDiv), 
287c0 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
287d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
287e0 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72   Reparent childr
287f0 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e  en of all cells.
28800 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
28810 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
28820 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
28830 43 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77  ChildPages(apNew
28840 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
28850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
28860 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28870 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72  up;.  }.  rc = r
28880 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
28890 73 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  s(pParent);.  if
288a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
288b0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
288c0 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20  leanup;..  /*.  
288d0 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70  ** Balance the p
288e0 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74  arent page.  Not
288f0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65  e that the curre
28900 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20  nt page (pPage) 
28910 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20  might.  ** have 
28920 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  been added to th
28930 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74  e freelist so it
28940 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72   might no longer
28950 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
28960 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61  .  ** But the pa
28970 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61  rent page will a
28980 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c  lways be initial
28990 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ized..  */.  ass
289a0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
289b0 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62  Init );.  rc = b
289c0 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20  alance(pParent, 
289d0 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
289e0 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
289f0 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
28a00 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
28a10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
28a20 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
28a30 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
28a40 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
28a50 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
28a60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
28a70 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
28a80 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
28a90 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
28aa0 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
28ab0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
28ac0 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74  CE: finished wit
28ad0 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  h %d: old=%d new
28ae0 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
28af0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
28b00 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e  ->pgno, nOld, nN
28b10 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72  ew, nCell));.  r
28b20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28b30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28b40 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
28b50 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
28b60 20 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20   btree when the 
28b70 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e  root.** page con
28b80 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
28b90 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f   This is an oppo
28ba0 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  rtunity to make 
28bb0 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c  the tree.** shal
28bc0 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76  lower by one lev
28bd0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
28be0 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  t balance_shallo
28bf0 77 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  wer(MemPage *pPa
28c00 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
28c10 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  pChild;         
28c20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
28c30 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50  child page of pP
28c40 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
28c50 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  noChild;        
28c60 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
28c70 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20  mber for pChild 
28c80 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
28c90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28ca0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28cb0 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
28cc0 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  res */.  BtShare
28cd0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
28ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28cf0 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63  main BTree struc
28d00 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ture */.  int mx
28d10 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20  CellPerPage;    
28d20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
28d30 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  m number of cell
28d40 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20  s per page */.  
28d50 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d70 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  All cells from p
28d80 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ages being balan
28d90 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a  ced */.  int *sz
28da0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
28db0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
28dc0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
28dd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
28de0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
28df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
28e00 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
28e10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28e20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
28e30 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
28e40 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
28e50 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c  e->pBt;.  mxCell
28e60 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c  PerPage = MX_CEL
28e70 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c  L(pBt);.  apCell
28e80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
28e90 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  c( mxCellPerPage
28ea0 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69  *(sizeof(u8*)+si
28eb0 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a 20 20  zeof(int)) );.  
28ec0 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20  if( apCell==0 ) 
28ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28ee0 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  MEM;.  szCell = 
28ef0 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78  (int*)&apCell[mx
28f00 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20  CellPerPage];.  
28f10 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
28f20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
28f30 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
28f40 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54  y empty */.    T
28f50 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
28f60 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e  empty table %d\n
28f70 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
28f80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28f90 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
28fa0 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
28fb0 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
28fc0 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a  nsfer the.    **
28fd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
28fe0 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64  m that one child
28ff0 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70   into the root p
29000 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a  age if it .    *
29010 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
29020 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
29030 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
29040 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  by one..    **. 
29050 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f     ** If the roo
29060 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  t page is page 1
29070 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70  , it has less sp
29080 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68  ace available th
29090 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68  an.    ** its ch
290a0 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20  ild (due to the 
290b0 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20  100 byte header 
290c0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
290d0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
290e0 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
290f0 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
29100 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
29110 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
29120 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66   the .    ** inf
29130 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
29140 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
29150 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
29160 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20  his is the .    
29170 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
29180 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
29190 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
291a0 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
291b0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
291c0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f  right-pointer to
291d0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
291e0 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65    The child page
291f0 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20   becomes.    ** 
29200 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
29210 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
29220 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69    */.    pgnoChi
29230 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
29240 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
29250 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
29260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
29270 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20  noChild>0 );.   
29280 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
29290 6c 64 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ld<=sqlite3Pager
292a0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  Pagecount(pPage-
292b0 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b  >pBt->pPager) );
292c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
292d0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
292e0 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
292f0 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
29300 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
29310 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
29320 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
29330 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
29340 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
29350 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
29360 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
29370 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
29380 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
29390 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
293a0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
293b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
293c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69  ;.      if( pChi
293d0 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29  ld->nFree>=100 )
293e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
293f0 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69   child informati
29400 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  on will fit on t
29410 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f  he root page, so
29420 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   do the.        
29430 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  ** copy */.     
29440 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29450 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
29460 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
29470 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
29480 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
29490 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
294a0 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d         apCell[i]
294b0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69   = findCell(pChi
294c0 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ld,i);.         
294d0 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c   szCell[i] = cel
294e0 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c  lSizePtr(pChild,
294f0 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   apCell[i]);.   
29500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
29510 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67  ssemblePage(pPag
29520 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  e, pChild->nCell
29530 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  , apCell, szCell
29540 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  );.        /* Co
29550 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  py the right-poi
29560 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
29570 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  d to the parent.
29580 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34   */.        put4
29590 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
295a0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
295b0 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20  set+8], .       
295c0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
295d0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68  Child->aData[pCh
295e0 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ild->hdrOffset+8
295f0 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ]));.        fre
29600 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
29610 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
29620 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
29630 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67   transfer to pag
29640 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
29650 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65  pgno));.      }e
29660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
29670 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f  The child has mo
29680 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
29690 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  hat will fit on 
296a0 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20  the root..      
296b0 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
296c0 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
296d0 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
296e0 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  */.        TRACE
296f0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
29700 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  d %d will not fi
29710 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20  t on page 1\n", 
29720 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
29730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29740 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
29750 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43  pPage->aData, pC
29760 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61  hild->aData, pPa
29770 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
29780 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
29790 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
297a0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72       pPage->pPar
297b0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ent = 0;.      r
297c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
297d0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
297e0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
297f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29800 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
29810 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
29820 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29830 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
29840 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
29850 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29860 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
29870 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
29880 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
29890 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
298a0 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73  s(pPage);.    as
298b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
298c0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
298d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
298e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
298f0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
29900 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uum ){.      int
29910 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
29920 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
29930 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
29940 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29950 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
29960 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29980 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29990 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
299a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
299b0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
299c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
299d0 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64  pChild);.  }.end
299e0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
299f0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
29a00 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
29a10 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
29a20 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
29a30 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
29a40 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
29a50 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
29a60 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
29a70 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
29a80 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
29a90 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
29aa0 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
29ab0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
29ac0 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
29ad0 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
29ae0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
29af0 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
29b00 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
29b10 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
29b20 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
29b30 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
29b40 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
29b50 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
29b60 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
29b70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
29b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29b90 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
29ba0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
29bb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
29bc0 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
29bd0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
29be0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
29bf0 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
29c00 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
29c10 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
29c20 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
29c30 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
29c40 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
29c50 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
29c60 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
29c70 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
29c80 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
29c90 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
29ca0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
29cb0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
29cc0 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
29cd0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
29ce0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
29cf0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
29d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
29d10 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
29d20 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
29d30 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
29d40 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
29d50 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
29d60 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
29d70 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
29d80 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
29d90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29da0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29db0 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  >0 );.  pBt = pP
29dc0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
29dd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29de0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
29df0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c  x) );.  rc = all
29e00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
29e10 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67  Bt, &pChild, &pg
29e20 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e  noChild, pPage->
29e30 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20  pgno, 0);.  if( 
29e40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29e50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29e60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29e70 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
29e80 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  e) );.  usableSi
29e90 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
29ea0 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70  Size;.  data = p
29eb0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
29ec0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
29ed0 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67  ffset;.  brk = g
29ee0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
29ef0 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
29f00 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
29f10 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
29f20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
29f30 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
29f40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
29f50 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
29f60 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62  ta[brk], &data[b
29f70 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d  rk], usableSize-
29f80 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  brk);.  assert( 
29f90 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d  pChild->isInit==
29fa0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
29fb0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
29fc0 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
29fd0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
29fe0 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
29ff0 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68  ut;.  memcpy(pCh
2a000 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  ild->aOvfl, pPag
2a010 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  e->aOvfl, pPage-
2a020 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
2a030 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2a040 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e  ]));.  pChild->n
2a050 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65  Overflow = pPage
2a060 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69  ->nOverflow;.  i
2a070 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
2a080 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69  flow ){.    pChi
2a090 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ld->nFree = 0;. 
2a0a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68   }.  assert( pCh
2a0b0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67  ild->nCell==pPag
2a0c0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65  e->nCell );.  ze
2a0d0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
2a0e0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
2a0f0 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
2a100 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2a110 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2a120 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
2a130 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28  hild);.  TRACE((
2a140 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
2a150 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
2a160 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2a170 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2a180 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a190 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a1a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2a1b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  cuum ){.    int 
2a1c0 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  i;.    rc = ptrm
2a1d0 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c  apPut(pBt, pChil
2a1e0 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  d->pgno, PTRMAP_
2a1f0 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67  BTREE, pPage->pg
2a200 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2a210 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
2a220 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f  eper_out;.    fo
2a230 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
2a240 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2a250 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2a260 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69  utOvfl(pChild, i
2a270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2a280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a290 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2a2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a2b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d   }.#endif.  rc =
2a2c0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2a2d0 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e  (pChild);..balan
2a2e0 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20  cedeeper_out:.  
2a2f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2a300 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ld);.  return rc
2a310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64  ;.}../*.** Decid
2a320 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50  e if the page pP
2a330 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
2a340 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61  balanced.  If ba
2a350 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65  lancing is.** re
2a360 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65  quired, call the
2a370 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
2a380 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  ancing routine..
2a390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2a3a0 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  lance(MemPage *p
2a3b0 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74  Page, int insert
2a3c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a3d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2a3e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a3f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2a400 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2a410 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
2a420 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2a430 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a440 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2a460 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2a470 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2a480 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2a490 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
2a4a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2a4b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a4c0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  && pPage->nCell=
2a4d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2a4e0 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2a4f0 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
2a500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2a510 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2a520 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ow>0 || .       
2a530 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61   (!insert && pPa
2a540 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d  ge->nFree>pPage-
2a550 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2a560 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72  *2/3) ){.      r
2a570 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2a580 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20  oot(pPage);.    
2a590 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2a5a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a5b0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
2a5c0 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74  all cursors that
2a5d0 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20   point to table 
2a5e0 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20  pgnoRoot..** If 
2a5f0 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72  any of those cur
2a600 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64  sors were opened
2a610 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
2a620 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  in a different.*
2a630 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
2a640 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73  ction (a databas
2a650 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  e connection tha
2a660 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67  t shares the pag
2a670 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68  er.** cache with
2a680 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2a690 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61  nection) and tha
2a6a0 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  t other connecti
2a6b0 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  on .** is not in
2a6c0 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d   the ReadUncommm
2a6d0 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65  itted state, the
2a6e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
2a6f0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
2a700 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20  E_LOCKED..**.** 
2a710 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63  In addition to c
2a720 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64  hecking for read
2a730 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20  -locks (where a 
2a740 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65  read-lock .** me
2a750 61 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65  ans a cursor ope
2a760 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
2a770 3d 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0) this routine
2a780 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61   also moves.** a
2a790 6c 6c 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ll write cursors
2a7a0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
2a7b0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  e pointing to th
2a7c0 65 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c  e .** first Cell
2a7d0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2a7e0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
2a7f0 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e  ssary because an
2a800 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64   insert .** or d
2a810 65 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e  elete might chan
2a820 67 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ge the number of
2a830 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65   cells on a page
2a840 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20   or delete.** a 
2a850 70 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e  page entirely an
2a860 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  d we do not want
2a870 20 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75   to leave any cu
2a880 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  rsors .** pointi
2a890 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61  ng to non-exista
2a8a0 6e 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c  nt pages or cell
2a8b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2a8c0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2a8d0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50  Btree *pBtree, P
2a8e0 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74  gno pgnoRoot, Bt
2a8f0 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65  Cursor *pExclude
2a900 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2a910 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2a920 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
2a930 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2a940 20 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65   pBtree->pSqlite
2a950 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a960 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2a970 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
2a980 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
2a990 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
2a9a0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70  t){.    if( p==p
2a9b0 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e  Exclude ) contin
2a9c0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  ue;.    if( p->e
2a9d0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2a9e0 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LID ) continue;.
2a9f0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
2aa00 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20  oot!=pgnoRoot ) 
2aa10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2aa20 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29  ( p->wrFlag==0 )
2aa30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2aa40 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42  *dbOther = p->pB
2aa50 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20  tree->pSqlite;. 
2aa60 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
2aa70 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
2aa80 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20  (dbOther!=db && 
2aa90 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
2aaa0 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
2aab0 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b  ommitted)==0) ){
2aac0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2aad0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2aae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2aaf0 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70   if( p->pPage->p
2ab00 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74  gno!=p->pgnoRoot
2ab10 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f   ){.      moveTo
2ab20 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Root(p);.    }. 
2ab30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2ab40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2ab50 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2ab60 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2ab70 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2ab80 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2ab90 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2aba0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2abb0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2abc0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2abd0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2abe0 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2abf0 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2ac00 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2ac10 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2ac20 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2ac30 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2ac40 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2ac50 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2ac60 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2ac70 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2ac80 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2ac90 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2aca0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2acb0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2acc0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2acd0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2ace0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2acf0 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2ad00 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ad20 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2ad30 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2ad40 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2ad50 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2ad60 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2ad70 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2ad80 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2ad90 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2ada0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2adb0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2adc0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2add0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2ae00 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2ae10 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2ae20 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae40 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2ae50 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2ae60 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2ae70 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2ae80 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d    int szNew;.  M
2ae90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2aea0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2aeb0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2aec0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2aed0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2aee0 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2aef0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2af00 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
2af10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2af20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2af30 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2af40 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2af50 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2af60 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2af70 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2af80 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2af90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2afa0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2afb0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2afc0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2afd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2afe0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2aff0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2b000 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2b010 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b020 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2b030 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
2b040 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2b050 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2b060 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2b070 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2b080 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20  Root, pCur) ){. 
2b090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b0a0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2b0b0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2b0c0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2b0d0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
2b0e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b0f0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2b100 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2b110 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
2b120 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2b130 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2b140 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2b150 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2b160 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2b170 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
2b180 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2b190 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2b1a0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2b1b0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2b1c0 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2b1d0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2b1e0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2b1f0 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
2b200 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
2b210 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
2b220 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
2b230 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2b240 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
2b250 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
2b260 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
2b270 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
2b280 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  | !pPage->leafDa
2b290 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ta );.  TRACE(("
2b2a0 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
2b2b0 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
2b2c0 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
2b2d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
2b2e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
2b2f0 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
2b300 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2b310 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
2b320 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
2b330 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
2b340 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2b350 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71  ;.  newCell = sq
2b360 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 4d 58  lite3_malloc( MX
2b370 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2b380 29 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  );.  if( newCell
2b390 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2b3a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
2b3b0 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
2b3c0 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
2b3d0 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
2b3e0 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
2b3f0 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
2b400 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2b410 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
2b420 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
2b430 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
2b440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
2b450 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
2b460 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c  (pBt) );.  if( l
2b470 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2b480 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2b490 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ate ){.    int s
2b4a0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2b4b0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
2b4c0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
2b4d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2b4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b4f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2b500 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2b510 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
2b520 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2b530 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
2b540 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2b550 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20   pCur->idx);.   
2b560 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2b570 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
2b580 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
2b590 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
2b5a0 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
2b5b0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
2b5c0 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
2b5d0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2b5e0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69   oldCell);.    i
2b5f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2b600 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f  _insert;.    dro
2b610 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2b620 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  r->idx, szOld);.
2b630 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
2b640 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
2b650 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
2b660 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2b670 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b  ;.    pCur->idx+
2b680 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  +;.    pCur->inf
2b690 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  o.nSize = 0;.  }
2b6a0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2b6b0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2b6c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
2b6d0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2b6e0 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ur->idx, newCell
2b6f0 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
2b700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b710 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69  _OK ) goto end_i
2b720 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61  nsert;.  rc = ba
2b730 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b  lance(pPage, 1);
2b740 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72  .  /* sqlite3Btr
2b750 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d  eePageDump(pCur-
2b760 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
2b770 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f  Root, 1); */.  /
2b780 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  * fflush(stdout)
2b790 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  ; */.  if( rc==S
2b7a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b7b0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2b7c0 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
2b7d0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2b7e0 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74  (newCell);.  ret
2b7f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b800 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72   Delete the entr
2b810 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
2b820 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2b830 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2b840 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b850 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2b860 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  cation..*/.int s
2b870 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2b880 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2b890 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2b8a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2b8b0 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
2b8c0 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
2b8d0 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
2b8e0 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72  Child = 0;.  Btr
2b8f0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
2b900 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
2b910 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2b920 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b930 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b940 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b950 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2b960 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2b970 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2b980 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2b990 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2b9a0 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2b9b0 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a  doing a delete *
2b9c0 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
2b9d0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2b9e0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2b9f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
2ba00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2ba10 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2ba20 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20  adOnly );.  if( 
2ba30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ba40 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2ba50 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2ba60 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  kip;.  }.  if( p
2ba70 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67  Cur->idx >= pPag
2ba80 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2ba90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2baa0 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72  ROR;  /* The cur
2bab0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
2bac0 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ing to anything 
2bad0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43  */.  }.  if( !pC
2bae0 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  ur->wrFlag ){.  
2baf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bb00 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e  PERM;   /* Did n
2bb10 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72  ot open this cur
2bb20 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  sor for writing 
2bb30 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65  */.  }.  if( che
2bb40 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72  ckReadLocks(pCur
2bb50 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e  ->pBtree, pCur->
2bb60 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20  pgnoRoot, pCur) 
2bb70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bb80 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
2bb90 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
2bba0 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
2bbb0 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
2bbc0 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68  .  /* Restore th
2bbd0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2bbe0 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d   position (a no-
2bbf0 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  op if the cursor
2bc00 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a   is not in .  **
2bc10 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2bc20 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73  EEK state) and s
2bc30 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
2bc40 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
2bc50 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65  ursors .  ** ope
2bc60 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  n on the same ta
2bc70 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73  ble. Then call s
2bc80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2bc90 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  () on the page. 
2bca0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74   ** that the ent
2bcb0 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  ry will be delet
2bcc0 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20  ed from..  */.  
2bcd0 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72  if( .    (rc = r
2bce0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2bcf0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2bd00 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2bd10 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
2bd20 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2bd30 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30  oRoot, pCur))!=0
2bd40 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71   ||.    (rc = sq
2bd50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bd60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2bd70 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
2bd80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2bd90 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
2bda0 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61  l within it's pa
2bdb0 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
2bdc0 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
2bdd0 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
2bde0 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
2bdf0 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
2be00 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2be10 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
2be20 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
2be30 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
2be40 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
2be50 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2be60 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2be70 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50  >idx);.  if( !pP
2be80 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2be90 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2bea0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2beb0 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2bec0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2bed0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2bee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2bef0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
2bf00 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  leaf ){.    /*. 
2bf10 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20     ** The entry 
2bf20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2bf30 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20  delete is not a 
2bf40 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f  leaf so if we do
2bf50 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73   not.    ** do s
2bf60 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c  omething we will
2bf70 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e   leave a hole on
2bf80 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67   an internal pag
2bf90 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76  e..    ** We hav
2bfa0 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f  e to fill the ho
2bfb0 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20  le by moving in 
2bfc0 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  a cell from a le
2bfd0 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  af.  The.    ** 
2bfe0 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20  next Cell after 
2bff0 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65  the one to be de
2c000 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e 74  leted is guarant
2c010 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64  eed to exist and
2c020 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20  .    ** to be a 
2c030 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75  leaf so we can u
2c040 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
2c050 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43    BtCursor leafC
2c060 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ur;.    unsigned
2c070 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20   char *pNext;.  
2c080 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b 20 20 2f    int szNext;  /
2c090 2a 20 54 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  * The compiler w
2c0a0 61 72 6e 69 6e 67 20 69 73 20 77 72 6f 6e 67 3a  arning is wrong:
2c0b0 20 73 7a 4e 65 78 74 20 69 73 20 61 6c 77 61 79   szNext is alway
2c0c0 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s .             
2c0d0 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
2c0e0 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ed before use.  
2c0f0 41 64 64 69 6e 67 20 61 6e 20 65 78 74 72 61 20  Adding an extra 
2c100 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c120 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  ** to silence th
2c130 65 20 63 6f 6d 70 69 6c 65 72 20 73 6c 6f 77 73  e compiler slows
2c140 20 64 6f 77 6e 20 74 68 65 20 63 6f 64 65 2e 20   down the code. 
2c150 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  */.    int notUs
2c160 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ed;.    unsigned
2c170 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20   char *tempCell 
2c180 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2c190 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74   !pPage->leafDat
2c1a0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
2c1b0 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
2c1c0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2c1d0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2c1e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2c1f0 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2c200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c230 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72  gerWrite(leafCur
2c240 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  .pPage->pDbPage)
2c250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c270 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2c280 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2c290 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2c2a0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2c2b0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2c2c0 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2c2d0 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2c2e0 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2c2f0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2c300 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2c310 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2c320 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2c330 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2c340 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2c350 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2c360 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2c370 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2c380 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2c390 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2c3a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2c3b0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2c3c0 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2c3d0 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73      tempCell = s
2c3e0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 4d  qlite3_malloc( M
2c3f0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2c400 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65   );.      if( te
2c410 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  mpCell==0 ){.   
2c420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c430 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2c440 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c460 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2c470 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c480 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20  ->idx, pNext-4, 
2c490 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65  szNext+4, tempCe
2c4a0 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
2c4b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74  _OK ){.      put
2c4d0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2c4e0 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  owCell(pPage, pC
2c4f0 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68  ur->idx), pgnoCh
2c500 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ild);.      rc =
2c510 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2c520 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
2c530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c540 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  ){.      dropCel
2c550 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2c560 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a   leafCur.idx, sz
2c570 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Next);.      rc 
2c580 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75  = balance(leafCu
2c590 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  r.pPage, 0);.   
2c5a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2c5b0 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20  ree(tempCell);. 
2c5c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2c5d0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
2c5e0 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65  (&leafCur);.  }e
2c5f0 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28  lse{.    TRACE((
2c600 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2c610 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65  d delete from le
2c620 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
2c630 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2c640 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2c650 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2c660 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2c670 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2c680 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72  , pCell));.    r
2c690 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2c6a0 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e, 0);.  }.  if(
2c6b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c6c0 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
2c6d0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
2c6e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c6f0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
2c700 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
2c710 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
2c720 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
2c730 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
2c740 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
2c750 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
2c760 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
2c770 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
2c780 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2c790 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
2c7a0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
2c7b0 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
2c7c0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
2c7d0 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
2c7e0 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
2c7f0 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
2c800 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
2c810 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
2c820 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
2c830 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
2c840 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
2c850 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
2c880 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63  ndices.*/.static
2c890 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65   int btreeCreate
2c8a0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2c8b0 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
2c8c0 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
2c8d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2c8e0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
2c8f0 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
2c900 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
2c910 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2c920 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2c930 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70  ex(p) );.  if( p
2c940 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2c950 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
2c960 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
2c970 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2c980 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72  n first */.    r
2c990 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2c9a0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2c9b0 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2c9c0 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OR;.    return r
2c9d0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2c9e0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2c9f0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
2ca00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2ca10 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  M.  rc = allocat
2ca20 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2ca30 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
2ca40 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  t, 1, 0);.  if( 
2ca50 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2ca60 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20   rc;.  }.#else. 
2ca70 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2ca80 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
2ca90 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20   pgnoMove;      
2caa0 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68  /* Move a page h
2cab0 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  ere to make room
2cac0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
2cad0 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  ge */.    MemPag
2cae0 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a  e *pPageMove; /*
2caf0 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76   The page to mov
2cb00 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e to. */..    /*
2cb10 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   Creating a new 
2cb20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62  table may probab
2cb30 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ly require movin
2cb40 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61  g an existing da
2cb50 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f  tabase.    ** to
2cb60 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
2cb70 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f  he new tables ro
2cb80 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65  ot page. In case
2cb90 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73   this page turns
2cba0 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  .    ** out to b
2cbb0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2cbc0 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f  ge, delete all o
2cbd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70  verflow page-map
2cbe0 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68   caches.    ** h
2cbf0 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73  eld by open curs
2cc00 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ors..    */.    
2cc10 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
2cc20 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
2cc30 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
2cc40 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
2cc50 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
2cc60 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
2cc70 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
2cc80 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
2cc90 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
2cca0 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
2ccb0 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
2ccc0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2ccd0 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
2cce0 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
2ccf0 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page is (meta[3
2cd00 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ]+1)..    */.   
2cd10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2cd20 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2cd30 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
2cd40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cd50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2cd60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2cd70 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..   
2cd80 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74   /* The new root
2cd90 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65  -page may not be
2cda0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20   allocated on a 
2cdb0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2cdc0 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
2cdd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67  PENDING_BYTE pag
2cde0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2cdf0 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
2ce00 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
2ce10 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
2ce20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
2ce30 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2ce40 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
2ce50 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
2ce60 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2ce70 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
2ce80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
2ce90 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
2cea0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
2ceb0 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
2cec0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
2ced0 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
2cee0 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
2cef0 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
2cf00 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
2cf10 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
2cf20 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
2cf30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
2cf40 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2cf50 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2cf60 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2cf70 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2cf80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cf90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2cfa0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2cfb0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2cfc0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
2cfd0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
2cfe0 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
2cff0 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
2d000 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
2d010 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
2d020 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
2d030 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
2d040 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
2d050 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
2d060 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
2d070 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
2d080 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
2d090 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2d0a0 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
2d0b0 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
2d0c0 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
2d0d0 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
2d0e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
2d0f0 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
2d100 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
2d110 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
2d120 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
2d130 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d140 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
2d150 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
2d160 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
2d170 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
2d180 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
2d190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2d1a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2d1b0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2d1c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2d1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d1e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2d1f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2d200 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2d210 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2d220 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
2d230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d240 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54  =SQLITE_OK || eT
2d250 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
2d260 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  PAGE || eType==P
2d270 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2d280 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2d290 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2d2a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2d2c0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2d2d0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
2d2e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2d2f0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45  Type!=PTRMAP_FRE
2d300 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72  EPAGE );.      r
2d310 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d320 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
2d330 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2d340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d350 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2d360 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2d370 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2d390 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
2d3a0 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79  (pBt, pRoot, eTy
2d3b0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67  pe, iPtrPage, pg
2d3c0 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72  noMove);.      r
2d3d0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2d3e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
2d3f0 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
2d400 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
2d410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2d430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d440 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2d450 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2d460 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2d470 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2d480 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2d4a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d4b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2d4c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d4d0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2d4e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d4f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d500 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d510 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2d520 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d530 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2d540 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
2d550 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
2d560 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2d570 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
2d580 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
2d590 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2d5a0 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
2d5b0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2d5c0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
2d5d0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2d5e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2d5f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d600 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2d610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d620 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2d630 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2d640 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
2d650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2d660 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d670 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2d680 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d690 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
2d6a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2d6b0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2d6c0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2d6d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2d6e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2d6f0 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
2d700 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2d710 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
2d720 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2d730 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
2d740 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
2d750 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2d760 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
2d770 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
2d780 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
2d790 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
2d7a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
2d7b0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
2d7c0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2d7d0 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
2d7e0 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
2d7f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
2d800 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
2d810 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
2d820 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
2d830 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
2d840 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2d850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d860 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
2d870 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
2d880 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
2d890 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
2d8a0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
2d8b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2d8c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2d8d0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
2d8e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2d8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d900 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
2d910 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
2d920 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
2d930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d940 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
2d950 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
2d960 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2d970 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
2d980 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
2d990 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
2d9a0 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
2d9b0 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
2d9c0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
2d9d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d9e0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
2d9f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2da00 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
2da10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2da20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2da30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2da40 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67   pgno>sqlite3Pag
2da50 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
2da60 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
2da70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2da80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2da90 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2daa0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2dab0 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
2dac0 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
2dad0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2dae0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
2daf0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2db00 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2db10 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2db20 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2db30 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2db40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
2db50 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2db60 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2db70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
2db80 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
2db90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2dba0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2dbb0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2dbc0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2dbd0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2dbe0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2dbf0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2dc00 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2dc10 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2dc20 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2dc30 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2dc40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2dc50 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
2dc60 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2dc70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2dc80 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2dc90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2dca0 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
2dcb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2dcc0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2dcd0 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2dce0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dcf0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dd00 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
2dd10 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
2dd20 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
2dd30 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
2dd40 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2dd50 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2dd60 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2dd70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2dd80 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
2dd90 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
2dda0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2ddb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
2ddc0 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
2ddd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2dde0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2ddf0 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
2de00 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2de10 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
2de20 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
2de30 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
2de40 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2de50 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
2de60 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
2de70 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2de80 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
2de90 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2dea0 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
2deb0 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
2dec0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
2ded0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2dee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2def0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
2df00 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2df10 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
2df20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2df30 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
2df40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2df50 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
2df60 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2df70 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2df80 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2df90 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2dfa0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
2dfb0 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65 63  e if( (rc = chec
2dfc0 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
2dfd0 61 62 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49 54  able, 0))!=SQLIT
2dfe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e  E_OK ){.    /* n
2dff0 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
2e000 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
2e010 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2e020 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2e030 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a   iTable, 0)) ){.
2e040 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
2e050 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  o do */.  }else{
2e060 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2e070 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2e080 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
2e090 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
2e0a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
2e0b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e0c0 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
2e0d0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
2e0e0 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64   a table and add
2e0f0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2e100 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65   table to.** the
2e110 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65   freelist.  Exce
2e120 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  pt, the root of 
2e130 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61  the principle ta
2e140 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a  ble (the one on.
2e150 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65  ** page 1) is ne
2e160 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65  ver added to the
2e170 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
2e180 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
2e190 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
2e1a0 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
2e1b0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
2e1c0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  .** cursors on t
2e1d0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2e1e0 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
2e1f0 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65   enabled and the
2e200 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20   page at iTable 
2e210 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
2e220 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ** root page in 
2e230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e240 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  e, then the last
2e250 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69   root page .** i
2e260 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e270 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  ile is moved int
2e280 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65  o the slot forme
2e290 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a  rly occupied by.
2e2a0 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68  ** iTable and th
2e2b0 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72  at last slot for
2e2c0 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
2e2d0 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  y the last root 
2e2e0 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64  page.** is added
2e2f0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2e300 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62   instead of iTab
2e310 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79  le.  In this say
2e320 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  , all.** root pa
2e330 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20  ges are kept at 
2e340 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2e350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e360 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  le, which.** is 
2e370 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55  necessary for AU
2e380 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b  TOVACUUM to work
2e390 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65   right.  *piMove
2e3a0 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
2e3b0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
2e3c0 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20  that used to be 
2e3d0 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2e3e0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62  ge in the file b
2e3f0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76  efore.** the mov
2e400 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67  e.  If no page g
2e410 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f  ets moved, *piMo
2e420 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ved is set to 0.
2e430 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f  .** The last roo
2e440 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64  t page is record
2e450 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e  ed in meta[3] an
2e460 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
2e470 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64  * meta[3] is upd
2e480 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  ated by this pro
2e490 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  cedure..*/.stati
2e4a0 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54  c int btreeDropT
2e4b0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2e4c0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
2e4d0 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
2e4e0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2e4f0 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68  Page = 0;.  BtSh
2e500 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2e510 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Bt;..  assert( s
2e520 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2e530 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2e540 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
2e550 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2e560 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2e570 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2e580 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2e590 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
2e5a0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2e5b0 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
2e5c0 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
2e5d0 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
2e5e0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
2e5f0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
2e600 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2e610 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
2e620 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
2e630 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
2e640 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
2e650 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
2e660 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
2e670 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
2e680 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
2e690 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
2e6a0 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
2e6b0 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
2e6c0 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
2e6d0 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
2e6e0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2e6f0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2e700 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2e710 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
2e720 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  e, &pPage, 0);. 
2e730 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2e740 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
2e750 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2e760 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20  le(p, iTable);. 
2e770 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2e780 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2e790 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2e7a0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65  ;.  }..  *piMove
2e7b0 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54  d = 0;..  if( iT
2e7c0 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66  able>1 ){.#ifdef
2e7d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e7e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d  OVACUUM.    rc =
2e7f0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2e800 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2e810 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a  e(pPage);.#else.
2e820 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2e830 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2e840 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e   Pgno maxRootPgn
2e850 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
2e860 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
2e870 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74  a(p, 4, &maxRoot
2e880 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Pgno);.      if(
2e890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e8a0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2e8b0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e8d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2e8e0 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52  if( iTable==maxR
2e8f0 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  ootPgno ){.     
2e900 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
2e910 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
2e920 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69   is the table wi
2e930 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  th the largest r
2e940 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
2e950 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
2e960 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20  e database, put 
2e970 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e  the root page on
2e980 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20   the free list. 
2e990 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e9a0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2e9b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2e9c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2e9d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2e9e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2ea00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ea10 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2ea20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2ea30 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2ea40 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  d does not have 
2ea50 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
2ea60 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
2ea70 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
2ea80 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65  atabase. So move
2ea90 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64   the page that d
2eaa0 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  oes into the .  
2eab0 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66        ** gap lef
2eac0 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
2ead0 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20   root-page..    
2eae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
2eaf0 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20  emPage *pMove;. 
2eb00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2eb10 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2eb20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2eb30 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2eb40 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
2eb50 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
2eb60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2eb70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2eb80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2eb90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2eba0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
2ebb0 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d  pBt, pMove, PTRM
2ebc0 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
2ebd0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
2ebe0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f   releasePage(pMo
2ebf0 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ve);.        if(
2ec00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ec10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2ec20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2ec30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2ec40 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2ec50 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
2ec60 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
2ec70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ec80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ec90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2eca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ecb0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2ecc0 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2ecd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
2ece0 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
2ecf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ed00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2ed10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ed20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76  }.        *piMov
2ed30 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ed = maxRootPgno
2ed40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ed50 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20   /* Set the new 
2ed60 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20  'max-root-page' 
2ed70 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74  value in the dat
2ed80 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54 68  abase header. Th
2ed90 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
2eda0 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73  he old value les
2edb0 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20  s one, less one 
2edc0 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61 70  more if that hap
2edd0 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  pens to.      **
2ede0 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   be a root-page 
2edf0 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65  number, less one
2ee00 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20 69   again if that i
2ee10 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50  s the.      ** P
2ee20 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2ee30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ee40 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2ee50 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f        if( maxRoo
2ee60 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  tPgno==PENDING_B
2ee70 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2ee80 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
2ee90 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
2eea0 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f        if( maxRoo
2eeb0 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41  tPgno==PTRMAP_PA
2eec0 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f  GENO(pBt, maxRoo
2eed0 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  tPgno) ){.      
2eee0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2eef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2ef00 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67  ssert( maxRootPg
2ef10 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2ef20 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20  _PAGE(pBt) );.. 
2ef30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ef40 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2ef50 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67  (p, 4, maxRootPg
2ef60 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  no);.    }else{.
2ef70 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
2ef80 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2ef90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2efa0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
2efb0 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
2efc0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74 72  /* If sqlite3Btr
2efd0 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20  eeDropTable was 
2efe0 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
2eff0 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67  . */.    zeroPag
2f000 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54  e(pPage, PTF_INT
2f010 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a  KEY|PTF_LEAF );.
2f020 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f030 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
2f040 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
2f050 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
2f060 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
2f070 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
2f080 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
2f090 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
2f0a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2f0b0 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61  rc = btreeDropTa
2f0c0 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ble(p, iTable, p
2f0d0 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74  iMoved);.  sqlit
2f0e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2f0f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f100 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
2f110 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2f120 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62  n out of a datab
2f130 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b  ase file.  Meta[
2f140 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  0].** is the num
2f150 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
2f160 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
2f170 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
2f180 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68  ta[1].** through
2f190 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76   meta[15] are av
2f1a0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
2f1b0 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  by higher layers
2f1c0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2f1d0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20   read-only, the 
2f1e0 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f  others are read/
2f1f0 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  write..** .** Th
2f200 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e  e schema layer n
2f210 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75  umbers meta valu
2f220 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20  es differently. 
2f230 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   At the schema.*
2f240 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65  * layer (and the
2f250 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52   SetCookie and R
2f260 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65  eadCookie opcode
2f270 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s) the number of
2f280 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
2f290 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20  s not visible.  
2f2a0 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20  So Cookie[0] is 
2f2b0 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61  the same as Meta
2f2c0 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  [1]..*/.int sqli
2f2d0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2f2e0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
2f2f0 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a  x, u32 *pMeta){.
2f300 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2f310 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  e;.  int rc;.  u
2f320 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2f330 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
2f340 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
2f350 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2f360 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  r(p);..  /* Read
2f370 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
2f380 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
2f390 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
2f3a0 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
2f3b0 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
2f3c0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
2f3d0 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
2f3e0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2f3f0 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
2f400 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
2f410 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
2f420 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
2f430 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2f440 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
2f450 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
2f460 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54  l case by queryT
2f470 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c  ableLock() and l
2f480 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a  ockTable())..  *
2f490 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61  /.  rc = queryTa
2f4a0 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
2f4b0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
2f4c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f4d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2f4e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
2f4f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2f500 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
2f510 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2f520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f530 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
2f540 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
2f550 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f560 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2f570 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
2f580 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d   rc;.  }.  pP1 =
2f590 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
2f5a0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
2f5b0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
2f5c0 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62    *pMeta = get4b
2f5d0 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
2f5e0 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  x*4]);.  sqlite3
2f5f0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
2f600 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75  ge);..  /* If au
2f610 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
2f620 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
2f630 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
2f640 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
2f650 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
2f660 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
2f670 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
2f680 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
2f690 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
2f6a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2f6b0 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
2f6c0 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
2f6d0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
2f6e0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
2f6f0 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c   Grab the read-l
2f700 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  ock on page 1. *
2f710 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62  /.  rc = lockTab
2f720 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  le(p, 1, READ_LO
2f730 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  CK);.  sqlite3Bt
2f740 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
2f750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f760 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e  ** Write meta-in
2f770 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69  formation back i
2f780 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2f790 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a  .  Meta[0] is.**
2f7a0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d   read-only and m
2f7b0 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ay not be writte
2f7c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2f7d0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2f7e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2f7f0 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a  dx, u32 iMeta){.
2f800 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2f810 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2f820 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
2f830 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
2f840 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64  rt( idx>=1 && id
2f850 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74  x<=15 );.  sqlit
2f860 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2f870 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2f880 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2f890 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
2f8a0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2f8b0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2f8c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2f8d0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2f8e0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
2f8f0 3b 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d  ;.    pP1 = pBt-
2f900 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a  >pPage1->aData;.
2f910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f920 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
2f930 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2f940 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f960 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33   put4byte(&pP1[3
2f970 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74  6 + idx*4], iMet
2f980 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
2f990 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f9a0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64 78  UM.      if( idx
2f9b0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==7 ){.        a
2f9c0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
2f9d0 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d  Vacuum || iMeta=
2f9e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
2f9f0 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c  sert( iMeta==0 |
2fa00 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20  | iMeta==1 );.  
2fa10 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
2fa20 61 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20  acuum = iMeta;. 
2fa30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2fa40 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2fa50 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2fa60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fa70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2fa80 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68   flag byte at th
2fa90 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2faa0 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65  he page that the
2fab0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75   cursor.** is cu
2fac0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2fad0 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
2fae0 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74  te3BtreeFlags(Bt
2faf0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2fb00 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61   /* TODO: What a
2fb10 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55  bout CURSOR_REQU
2fb20 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50  IRESEEK state? P
2fb30 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20  robably need to 
2fb40 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72  call.  ** restor
2fb50 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
2fb60 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20  sition() here.. 
2fb70 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2fb80 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2fb90 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2fba0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2fbb0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fbc0 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43  ( pPage->pBt==pC
2fbd0 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74  ur->pBt );.  ret
2fbe0 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67  urn pPage ? pPag
2fbf0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2fc00 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a  hdrOffset] : 0;.
2fc10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
2fc20 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
2fc30 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
2fc40 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
2fc50 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
2fc60 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
2fc70 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
2fc80 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
2fc90 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
2fca0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
2fcb0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
2fcc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2fcd0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
2fce0 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
2fcf0 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
2fd00 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2fd10 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
2fd20 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
2fd30 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
2fd40 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
2fd50 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
2fd60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
2fd70 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
2fd80 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2fd90 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20  r *zMsg2;.  if( 
2fda0 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29  !pCheck->mxErr )
2fdb0 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63   return;.  pChec
2fdc0 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43  k->mxErr--;.  pC
2fdd0 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  heck->nErr++;.  
2fde0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
2fdf0 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d  rmat);.  zMsg2 =
2fe00 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
2fe10 28 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (0, zFormat, ap)
2fe20 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2fe30 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29    if( zMsg1==0 )
2fe40 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69   zMsg1 = "";.  i
2fe50 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  f( pCheck->zErrM
2fe60 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  sg ){.    char *
2fe70 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a  zOld = pCheck->z
2fe80 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65  ErrMsg;.    pChe
2fe90 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ck->zErrMsg = 0;
2fea0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
2feb0 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a  tring(&pCheck->z
2fec0 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c  ErrMsg, zOld, "\
2fed0 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32  n", zMsg1, zMsg2
2fee0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2fef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
2ff00 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ld);.  }else{.  
2ff10 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
2ff20 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72  ng(&pCheck->zErr
2ff30 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  Msg, zMsg1, zMsg
2ff40 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
2ff50 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
2ff60 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69  (zMsg2);.}.#endi
2ff70 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2ff80 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2ff90 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2ffa0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2ffb0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
2ffc0 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65  dd 1 to the refe
2ffd0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
2ffe0 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20  page iPage.  If 
2fff0 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
30000 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  nd.** reference 
30010 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64  to the page, add
30020 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
30030 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72  e to pCheck->zEr
30040 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  rMsg..** Return 
30050 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32  1 if there are 2
30060 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65   ore more refere
30070 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
30080 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20   and 0 if.** if 
30090 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
300a0 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  t reference to t
300b0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  he page..**.** A
300c0 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74  lso check that t
300d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
300e0 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a  s in bounds..*/.
300f0 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
30100 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20  Ref(IntegrityCk 
30110 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61  *pCheck, int iPa
30120 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  ge, char *zConte
30130 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65  xt){.  if( iPage
30140 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
30150 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65    if( iPage>pChe
30160 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61  ck->nPage || iPa
30170 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63  ge<0 ){.    chec
30180 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30190 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e  k, zContext, "in
301a0 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
301b0 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  r %d", iPage);. 
301c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
301d0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61  .  if( pCheck->a
301e0 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29  nRef[iPage]==1 )
301f0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
30200 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30210 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65  ntext, "2nd refe
30220 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64  rence to page %d
30230 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72  ", iPage);.    r
30240 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
30250 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e  eturn  (pCheck->
30260 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e  anRef[iPage]++)>
30270 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
30280 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
30290 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  CUUM./*.** Check
302a0 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
302b0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
302c0 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69  ap for page iChi
302d0 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70  ld maps to .** p
302e0 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69  age iParent, poi
302f0 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70  nter type ptrTyp
30300 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e  e. If not, appen
30310 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
30320 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e  ge.** to pCheck.
30330 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30340 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49  checkPtrmap(.  I
30350 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
30360 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69  ck,   /* Integri
30370 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74  ty check context
30380 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
30390 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
303a0 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65  Child page numbe
303b0 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  r */.  u8 eType,
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
303d0 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
303e0 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20  r map type */.  
303f0 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20  Pgno iParent,   
30400 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
30410 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ed pointer map p
30420 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
30430 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  r */.  char *zCo
30440 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a  ntext         /*
30450 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70   Context descrip
30460 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65  tion (used for e
30470 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a  rror msg) */.){.
30480 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65    int rc;.  u8 e
30490 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67  PtrmapType;.  Pg
304a0 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  no iPtrmapParent
304b0 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70  ;..  rc = ptrmap
304c0 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c  Get(pCheck->pBt,
304d0 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61   iChild, &ePtrma
304e0 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50  pType, &iPtrmapP
304f0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
30500 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30510 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
30520 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
30530 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72  xt, "Failed to r
30540 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25  ead ptrmap key=%
30550 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  d", iChild);.   
30560 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
30570 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21  if( ePtrmapType!
30580 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61  =eType || iPtrma
30590 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74  pParent!=iParent
305a0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
305b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
305c0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
305d0 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74  "Bad ptr map ent
305e0 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74  ry key=%d expect
305f0 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28  ed=(%d,%d) got=(
30600 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20  %d,%d)", .      
30610 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69  iChild, eType, i
30620 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54  Parent, ePtrmapT
30630 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65  ype, iPtrmapPare
30640 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  nt);.  }.}.#endi
30650 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  f../*.** Check t
30660 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
30670 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20  the freelist or 
30680 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
30690 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72  age list..** Ver
306a0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
306b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
306c0 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a  the list is N..*
306d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
306e0 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67  eckList(.  Integ
306f0 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
30700 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
30710 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  ecking context *
30720 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69  /.  int isFreeLi
30730 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  st,       /* Tru
30740 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74  e for a freelist
30750 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65  .  False for ove
30760 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20  rflow page list 
30770 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
30780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
30790 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69  ge number for fi
307a0 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  rst page in the 
307b0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  list */.  int N,
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307d0 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62  /* Expected numb
307e0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
307f0 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  he list */.  cha
30800 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
30810 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f     /* Context fo
30820 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
30830 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
30840 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d    int expected =
30850 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   N;.  int iFirst
30860 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c   = iPage;.  whil
30870 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43  e( N-- > 0 && pC
30880 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20  heck->mxErr ){. 
30890 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c     DbPage *pOvfl
308a0 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Page;.    unsign
308b0 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61  ed char *pOvflDa
308c0 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67  ta;.    if( iPag
308d0 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  e<1 ){.      che
308e0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
308f0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
30900 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64         "%d of %d
30910 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66   pages missing f
30920 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  rom overflow lis
30930 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64  t starting at %d
30940 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31  ",.          N+1
30950 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72  , expected, iFir
30960 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
30970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30980 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
30990 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
309a0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  ) ) break;.    i
309b0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  f( sqlite3PagerG
309c0 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65  et(pCheck->pPage
309d0 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  r, (Pgno)iPage, 
309e0 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20  &pOvflPage) ){. 
309f0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30a00 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30a10 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f  text, "failed to
30a20 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69   get page %d", i
30a30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Page);.      bre
30a40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  ak;.    }.    pO
30a50 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67  vflData = (unsig
30a60 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
30a70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
30a80 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69  OvflPage);.    i
30a90 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b  f( isFreeList ){
30aa0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67  .      int n = g
30ab0 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61  et4byte(&pOvflDa
30ac0 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20  ta[4]);.#ifndef 
30ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30ae0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
30af0 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
30b00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
30b10 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
30b20 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50  pCheck, iPage, P
30b30 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
30b40 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  0, zContext);.  
30b50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30b60 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d     if( n>pCheck-
30b70 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
30b80 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20  /4-8 ){.        
30b90 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30ba0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30bb0 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65  .           "fre
30bc0 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74  elist leaf count
30bd0 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65   too big on page
30be0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
30bf0 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20        N--;.     
30c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30c10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
30c20 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67  +){.          Pg
30c30 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67  no iFreePage = g
30c40 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61  et4byte(&pOvflDa
30c50 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e  ta[8+i*4]);.#ifn
30c60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30c70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
30c80 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
30c90 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
30ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30cb0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
30cc0 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50  ck, iFreePage, P
30cd0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
30ce0 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  0, zContext);.  
30cf0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
30d00 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
30d10 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65  Ref(pCheck, iFre
30d20 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  ePage, zContext)
30d30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30d40 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20      N -= n;.    
30d50 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
30d60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30d70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73  TOVACUUM.    els
30d80 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
30d90 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70  his database sup
30da0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
30db0 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e  m and iPage is n
30dc0 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  ot the last.    
30dd0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
30de0 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c  s overflow list,
30df0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
30e00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
30e10 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  y for.      ** t
30e20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67  he following pag
30e30 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e  e matches iPage.
30e40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30e50 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
30e60 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e  >autoVacuum && N
30e70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  >0 ){.        i 
30e80 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
30e90 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63  Data);.        c
30ea0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
30eb0 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45  k, i, PTRMAP_OVE
30ec0 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a  RFLOW2, iPage, z
30ed0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
30ee0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
30ef0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
30f00 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
30f10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30f20 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29  Unref(pOvflPage)
30f30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
30f40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
30f50 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
30f60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30f70 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30f80 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76  CHECK./*.** Do v
30f90 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68  arious sanity ch
30fa0 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  ecks on a single
30fb0 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e   page of a tree.
30fc0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
30fd0 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f  tree depth.  Roo
30fe0 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30  t pages return 0
30ff0 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f  .  Parents of ro
31000 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75  ot pages.** retu
31010 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  rn 1, and so for
31020 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65  th..** .** These
31030 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65   checks are done
31040 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20  :.**.**      1. 
31050 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
31060 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c  cells and freebl
31070 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72  ocks do not over
31080 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  lap.**          
31090 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63  but combine to c
310a0 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20  ompletely cover 
310b0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f  the page..**  NO
310c0 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    2.  Make sure 
310d0 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e  cell keys are in
310e0 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20   order..**  NO  
310f0 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  3.  Make sure no
31100 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61   key is less tha
31110 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c  n or equal to zL
31120 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e  owerBound..**  N
31130 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  4.  Make sure
31140 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74   no key is great
31150 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
31160 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e   to zUpperBound.
31170 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65  .**      5.  Che
31180 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
31190 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
311a0 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20  es..**      6.  
311b0 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c  Recursively call
311c0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f   checkTreePage o
311d0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a  n all children..
311e0 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69  **      7.  Veri
311f0 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74  fy that the dept
31200 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65  h of all childre
31210 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a  n is the same..*
31220 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20  *      8.  Make 
31230 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69  sure this page i
31240 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66  s at least 33% f
31250 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69  ull or else it i
31260 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  s.**          th
31270 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  e root of the tr
31280 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
31290 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  t checkTreePage(
312a0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
312b0 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74  pCheck,  /* Cont
312c0 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69  ext for the sani
312d0 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  ty check */.  in
312e0 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
312f0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
31300 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
31310 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d  o check */.  Mem
31320 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
31330 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
31340 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  e */.  char *zPa
31350 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20  rentContext  /* 
31360 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a  Parent context *
31370 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
31380 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pPage;.  int i, 
31390 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70  rc, depth, d2, p
313a0 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20  gno, cnt;.  int 
313b0 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a  hdr, cellStart;.
313c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75    int nCell;.  u
313d0 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61  8 *data;.  BtSha
313e0 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  red *pBt;.  int 
313f0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68  usableSize;.  ch
31400 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d  ar zContext[100]
31410 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a  ;.  char *hit;..
31420 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31430 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
31440 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  xt), zContext, "
31450 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67  Page %d: ", iPag
31460 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e);..  /* Check 
31470 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78  that the page ex
31480 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20  ists.  */.  pBt 
31490 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20  = pCheck->pBt;. 
314a0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
314b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
314c0 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
314d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
314e0 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
314f0 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43   iPage, zParentC
31500 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e  ontext) ) return
31510 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20   0;.  if( (rc = 
31520 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
31530 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
31540 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
31550 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63  )!=0 ){.    chec
31560 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31570 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
31580 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67      "unable to g
31590 65 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72  et the page. err
315a0 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29  or code=%d", rc)
315b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
315c0 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20    }.  if( (rc = 
315d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
315e0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72  Page(pPage, pPar
315f0 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ent))!=0 ){.    
31600 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31610 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31620 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31630 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72       "sqlite3Btr
31640 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74  eeInitPage() ret
31650 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20  urns error code 
31660 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
31670 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
31680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
31690 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
316a0 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  out all the cell
316b0 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20  s..  */.  depth 
316c0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
316d0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  i<pPage->nCell &
316e0 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b  & pCheck->mxErr;
316f0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
31700 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Cell;.    int sz
31710 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ;.    CellInfo i
31720 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  nfo;..    /* Che
31730 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66  ck payload overf
31740 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f  low pages.    */
31750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
31760 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
31770 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
31780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
31790 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20  On tree page %d 
317a0 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67  cell %d: ", iPag
317b0 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c  e, i);.    pCell
317c0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
317d0 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e,i);.    sqlite
317e0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
317f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
31800 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20   &info);.    sz 
31810 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  = info.nData;.  
31820 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
31830 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66  tKey ) sz += inf
31840 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65  o.nKey;.    asse
31850 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61  rt( sz==info.nPa
31860 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28  yload );.    if(
31870 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   sz>info.nLocal 
31880 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
31890 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e  ge = (sz - info.
318a0 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53  nLocal + usableS
318b0 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65  ize - 5)/(usable
318c0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20  Size - 4);.     
318d0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
318e0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
318f0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
31900 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
31910 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31920 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
31930 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
31940 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
31950 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f  ap(pCheck, pgnoO
31960 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
31970 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW1, iPage, zC
31980 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
31990 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68  .#endif.      ch
319a0 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20  eckList(pCheck, 
319b0 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61  0, pgnoOvfl, nPa
319c0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
319d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
319e0 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66  ck sanity of lef
319f0 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  t child page..  
31a00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
31a10 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
31a20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
31a30 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  te(pCell);.#ifnd
31a40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31a50 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
31a60 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31a70 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
31a80 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
31a90 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  k, pgno, PTRMAP_
31aa0 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43  BTREE, iPage, zC
31ab0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
31ac0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32  .#endif.      d2
31ad0 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65   = checkTreePage
31ae0 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61  (pCheck,pgno,pPa
31af0 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  ge,zContext);.  
31b00 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64      if( i>0 && d
31b10 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20  2!=depth ){.    
31b20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31b30 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31b40 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65  ext, "Child page
31b50 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29   depth differs")
31b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31b70 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20  depth = d2;.    
31b80 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  }.  }.  if( !pPa
31b90 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31ba0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31bb0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
31bc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
31bd0 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
31be0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
31bf0 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
31c00 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ext, .          
31c10 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70             "On p
31c20 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20  age %d at right 
31c30 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29  child: ", iPage)
31c40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31c50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31c60 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
31c70 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
31c80 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31c90 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
31ca0 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
31cb0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
31cc0 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
31cd0 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  age(pCheck, pgno
31ce0 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , pPage, zContex
31cf0 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43  t);.  }. .  /* C
31d00 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74  heck for complet
31d10 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68  e coverage of th
31d20 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61  e page.  */.  da
31d30 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
31d40 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
31d50 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68  ->hdrOffset;.  h
31d60 69 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  it = sqlite3Mall
31d70 6f 63 5a 65 72 6f 28 20 75 73 61 62 6c 65 53 69  ocZero( usableSi
31d80 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20  ze );.  if( hit 
31d90 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  ){.    memset(hi
31da0 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26  t, 1, get2byte(&
31db0 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20  data[hdr+5]));. 
31dc0 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62     nCell = get2b
31dd0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
31de0 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74  );.    cellStart
31df0 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
31e00 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
31e10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
31e20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
31e30 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
31e40 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74  (&data[cellStart
31e50 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  +i*2]);.      in
31e60 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  t size = cellSiz
31e70 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74  ePtr(pPage, &dat
31e80 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e  a[pc]);.      in
31e90 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
31ea0 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  pc+size-1)>=usab
31eb0 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29  leSize || pc<0 )
31ec0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
31ed0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31ee0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
31ef0 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
31f00 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
31f10 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
31f20 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
31f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
31f40 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a  r(j=pc+size-1; j
31f50 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  >=pc; j--) hit[j
31f60 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
31f70 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30   }.    for(cnt=0
31f80 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61  , i=get2byte(&da
31f90 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20  ta[hdr+1]); i>0 
31fa0 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20  && i<usableSize 
31fb0 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20  && cnt<10000; . 
31fc0 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29            cnt++)
31fd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
31fe0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
31ff0 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  a[i+2]);.      i
32000 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
32010 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  (i+size-1)>=usab
32020 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b  leSize || i<0 ){
32030 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
32040 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32050 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  0,  .           
32060 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
32070 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
32080 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
32090 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
320a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
320b0 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e  r(j=i+size-1; j>
320c0 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  =i; j--) hit[j]+
320d0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
320e0 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   i = get2byte(&d
320f0 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ata[i]);.    }. 
32100 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20     for(i=cnt=0; 
32110 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b  i<usableSize; i+
32120 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69  +){.      if( hi
32130 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]==0 ){.     
32140 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
32150 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d  }else if( hit[i]
32160 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  >1 ){.        ch
32170 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32180 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  eck, 0,.        
32190 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73    "Multiple uses
321a0 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20   for byte %d of 
321b0 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61  page %d", i, iPa
321c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
321d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
321e0 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64  }.    if( cnt!=d
321f0 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20  ata[hdr+7] ){.  
32200 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32210 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
32220 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65           "Fragme
32230 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64  nted space is %d
32240 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61   byte reported a
32250 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  s %d on page %d"
32260 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c  ,.          cnt,
32270 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50   data[hdr+7], iP
32280 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
32290 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68    sqlite3_free(h
322a0 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50  it);..  releaseP
322b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
322c0 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a  turn depth+1;.}.
322d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
322e0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
322f0 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
32300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
32310 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
32320 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32330 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65   does a complete
32340 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69   check of the gi
32350 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20  ven BTree file. 
32360 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61   aRoot[] is.** a
32370 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73  n array of pages
32380 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61   numbers were ea
32390 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ch page number i
323a0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
323b0 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20  of.** a table.  
323c0 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d  nRoot is the num
323d0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
323e0 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  n aRoot..**.** I
323f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65  f everything che
32400 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f  cks out, this ro
32410 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
32420 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e  LL.  If somethin
32430 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61  g is.** amiss, a
32440 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
32450 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
32460 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
32470 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  from malloc().**
32480 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
32490 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73  o that error mes
324a0 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  sage is returned
324b0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
324c0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
324d0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72  sponsible for fr
324e0 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  eeing the error 
324f0 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20  message when it 
32500 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72  is done..*/.char
32510 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e   *sqlite3BtreeIn
32520 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20  tegrityCheck(.  
32530 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a  Btree *p,     /*
32540 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   The btree to be
32550 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
32560 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41  t *aRoot,   /* A
32570 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20  n array of root 
32580 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f  pages numbers fo
32590 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65  r individual tre
325a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  es */.  int nRoo
325b0 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  t,    /* Number 
325c0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
325d0 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d  oot[] */.  int m
325e0 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70  xErr,    /* Stop
325f0 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72   reporting error
32600 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e  s after this man
32610 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72  y */.  int *pnEr
32620 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75  r    /* Write nu
32630 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
32640 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69  een to this vari
32650 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
32660 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
32670 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
32680 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64  heck;.  BtShared
32690 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
326a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
326b0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 52 65 66 20  nter(p);.  nRef 
326c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
326d0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
326e0 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
326f0 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
32700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32710 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
32720 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
32730 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44 75  urn sqlite3StrDu
32740 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
32750 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
32760 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32770 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
32780 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
32790 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
327a0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
327b0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
327c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
327d0 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
327e0 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
327f0 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
32800 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
32810 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64  pnErr = 0;.#ifnd
32820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32830 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
32840 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29  pBt->nTrunc!=0 )
32850 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61  {.    sCheck.nPa
32860 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ge = pBt->nTrunc
32870 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
32880 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
32890 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
328a0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
328b0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  t);.    sqlite3B
328c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
328d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
328e0 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d    sCheck.anRef =
328f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
32900 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
32910 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
32920 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
32930 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
32940 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
32950 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
32960 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
32970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
32980 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
32990 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50  return sqlite3MP
329a0 72 69 6e 74 66 28 70 2d 3e 70 53 71 6c 69 74 65  rintf(p->pSqlite
329b0 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c  , "Unable to mal
329c0 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a  loc %d bytes", .
329d0 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e          (sCheck.
329e0 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
329f0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
32a00 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
32a10 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ; i<=sCheck.nPag
32a20 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e  e; i++){ sCheck.
32a30 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a  anRef[i] = 0; }.
32a40 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59    i = PENDING_BY
32a50 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20  TE_PAGE(pBt);.  
32a60 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  if( i<=sCheck.nP
32a70 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63  age ){.    sChec
32a80 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a  k.anRef[i] = 1;.
32a90 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72    }.  sCheck.zEr
32aa0 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rMsg = 0;..  /* 
32ab0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
32ac0 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c  ity of the freel
32ad0 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b  ist.  */.  check
32ae0 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c  List(&sCheck, 1,
32af0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
32b00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
32b10 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
32b20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
32b30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
32b40 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73  ), "Main freelis
32b50 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  t: ");..  /* Che
32b60 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  ck all the table
32b70 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
32b80 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43  0; i<nRoot && sC
32b90 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29  heck.mxErr; i++)
32ba0 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b  {.    if( aRoot[
32bb0 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
32bc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32bd0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32be0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
32bf0 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f  toVacuum && aRoo
32c00 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  t[i]>1 ){.      
32c10 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68  checkPtrmap(&sCh
32c20 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50  eck, aRoot[i], P
32c30 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
32c40 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  0, 0);.    }.#en
32c50 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
32c60 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61  ePage(&sCheck, a
32c70 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73  Root[i], 0, "Lis
32c80 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a  t of tree roots:
32c90 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   ");.  }..  /* M
32ca0 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70  ake sure every p
32cb0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
32cc0 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20  is referenced.  
32cd0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
32ce0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26  =sCheck.nPage &&
32cf0 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69   sCheck.mxErr; i
32d00 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
32d10 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32d20 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63  UM.    if( sChec
32d30 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b  k.anRef[i]==0 ){
32d40 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
32d50 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
32d60 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
32d70 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
32d80 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
32d90 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
32da0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
32db0 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72  vacuum, make sur
32dc0 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74  e no tables cont
32dd0 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  ain.    ** refer
32de0 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72  ences to pointer
32df0 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20  -map pages..    
32e00 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63  */.    if( sChec
32e10 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26  k.anRef[i]==0 &&
32e20 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50   .       (PTRMAP
32e30 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21  _PAGENO(pBt, i)!
32e40 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f  =i || !pBt->auto
32e50 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
32e60 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32e70 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67  &sCheck, 0, "Pag
32e80 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73  e %d is never us
32e90 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  ed", i);.    }. 
32ea0 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
32eb0 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20  Ref[i]!=0 && .  
32ec0 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
32ed0 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26  ENO(pBt, i)==i &
32ee0 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  & pBt->autoVacuu
32ef0 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
32f00 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
32f10 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20  ck, 0, "Pointer 
32f20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72  map page %d is r
32f30 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a  eferenced", i);.
32f40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
32f50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
32f60 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   this analysis d
32f70 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79  id not leave any
32f80 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20   unref() pages. 
32f90 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65   */.  unlockBtre
32fa0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
32fb0 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71    if( nRef != sq
32fc0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
32fd0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
32fe0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
32ff0 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
33000 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61  , .      "Outsta
33010 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74  nding page count
33020 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f   goes from %d to
33030 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20   %d during this 
33040 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20  analysis",.     
33050 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61   nRef, sqlite3Pa
33060 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
33070 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a  >pPager).    );.
33080 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
33090 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65   up and report e
330a0 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  rrors..  */.  sq
330b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
330c0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
330d0 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29  ee(sCheck.anRef)
330e0 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68  ;.  *pnErr = sCh
330f0 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75  eck.nErr;.  retu
33100 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73  rn sCheck.zErrMs
33110 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
33120 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
33130 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f  RITY_CHECK */../
33140 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33150 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
33160 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
33170 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
33180 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66  *.** The pager f
33190 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72  ilename is invar
331a0 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20  iant as long as 
331b0 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20  the pager is.** 
331c0 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61  open so it is sa
331d0 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74  fe to access wit
331e0 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65  hout the BtShare
331f0 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73  d mutex..*/.cons
33200 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
33210 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
33220 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33230 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33240 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
33250 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  rn sqlite3PagerF
33260 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  ilename(p->pBt->
33270 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
33280 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74  * Return the pat
33290 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72  hname of the dir
332a0 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
332b0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
332c0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
332d0 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6f 72  e pager director
332e0 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69  y name is invari
332f0 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ant as long as t
33300 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f  he pager is.** o
33310 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66  pen so it is saf
33320 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68  e to access with
33330 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64  out the BtShared
33340 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74   mutex..*/.const
33350 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
33360 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74  reeGetDirname(Bt
33370 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
33380 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
33390 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
333a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72   sqlite3PagerDir
333b0 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
333c0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
333d0 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
333e0 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
333f0 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20  l file for this 
33400 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65  database. The re
33410 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  turn.** value of
33420 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
33430 20 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64   the same regard
33440 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
33450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33460 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
33470 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a  ated or not..**.
33480 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75  ** The pager jou
33490 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
334a0 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
334b0 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
334c0 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
334d0 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
334e0 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
334f0 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
33500 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
33510 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
33520 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
33530 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
33540 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
33550 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
33560 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
33570 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
33580 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  er);.}..#ifndef 
33590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
335a0 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
335b0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
335c0 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
335d0 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
335e0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
335f0 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
33600 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
33610 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
33620 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65  e pBtFrom may be
33630 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
33640 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
33650 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
33660 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
33670 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f  action on pBtFro
33680 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  m is rolled back
33690 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
336a0 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  btreeCopyFile(Bt
336b0 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
336c0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
336d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
336e0 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20   Pgno i, nPage, 
336f0 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a  nToPage, iSkip;.
33700 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
33710 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
33720 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
33730 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
33740 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
33750 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
33760 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
33770 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
33780 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33790 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
337a0 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
337b0 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53  ursor ) return S
337c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54  QLITE_BUSY;.  nT
337d0 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
337e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
337f0 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
33800 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  nPage = sqlite3P
33810 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
33820 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
33830 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
33840 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
33850 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  o);.  for(i=1; r
33860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33870 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
33880 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
33890 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
338a0 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
338b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
338c0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
338d0 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  om->pPager, i, &
338e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
338f0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33910 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42 74  gerOverwrite(pBt
33920 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 73  To->pPager, i, s
33930 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
33940 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20 20  ta(pDbPage));.  
33950 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33960 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
33970 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  }..  /* If the f
33980 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69 6e 67  ile is shrinking
33990 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20 70 61  , journal the pa
339a0 67 65 73 20 74 68 61 74 20 61 72 65 20 62 65 69  ges that are bei
339b0 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20 20 2a  ng truncated.  *
339c0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  * so that they c
339d0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
339e0 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  k if the commit 
339f0 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  fails..  */.  fo
33a00 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d  r(i=nPage+1; rc=
33a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
33a20 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  =nToPage; i++){.
33a30 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
33a40 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
33a50 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
33a60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33a70 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f  e3PagerGet(pBtTo
33a80 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44  ->pPager, i, &pD
33a90 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
33aa0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
33ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33ac0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
33ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
33ae0 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61  rDontWrite(pDbPa
33af0 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65 61 68  ge);.    /* Yeah
33b00 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72  .  It seems wier
33b10 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72  d to call DontWr
33b20 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65  ite() right afte
33b30 72 20 57 72 69 74 65 28 29 2e 20 20 42 75 74 0a  r Write().  But.
33b40 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62      ** that is b
33b50 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73  ecause the names
33b60 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64   of those proced
33b70 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63  ures do not exac
33b80 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65 70 72  tly .    ** repr
33b90 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20  esent what they 
33ba0 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61  do.  Write() rea
33bb0 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74  lly means "put t
33bc0 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a  his page in the.
33bd0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
33be0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
33bf0 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
33c00 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
33c10 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 74  written.    ** t
33c20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33c30 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e  ile later."  Don
33c40 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20  tWrite() undoes 
33c50 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20  the second part 
33c60 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  of.    ** that a
33c70 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  nd prevents the 
33c80 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20  page from being 
33c90 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
33ca0 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a 20 20  atabase.  The.  
33cb0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69    ** page is sti
33cc0 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ll on the rollba
33cd0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75  ck journal, thou
33ce0 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73  gh.  And that is
33cf0 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20 2a   the whole.    *
33d00 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20  * point of this 
33d10 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70 61 67  loop: to put pag
33d20 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
33d30 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ck journal. */. 
33d40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
33d50 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
33d60 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20   }.  if( !rc && 
33d70 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b  nPage<nToPage ){
33d80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33d90 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
33da0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50  BtTo->pPager, nP
33db0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
33dc0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
33dd0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
33de0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
33df0 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
33e00 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
33e10 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
33e20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
33e30 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
33e40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f  e3BtreeEnter(pTo
33e50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33e60 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20  eEnter(pFrom);. 
33e70 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46   rc = btreeCopyF
33e80 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b  ile(pTo, pFrom);
33e90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
33ea0 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
33eb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
33ec0 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
33ed0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
33ee0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
33ef0 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UUM */../*.** Re
33f00 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
33f10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
33f20 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
33f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
33f40 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  nTrans(Btree *p)
33f50 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
33f60 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
33f70 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69 74  x_held(p->pSqlit
33f80 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  e->mutex) );.  r
33f90 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
33fa0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
33fb0 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RITE));.}../*.**
33fc0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
33fd0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
33fe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
33ff0 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
34000 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74  lite3BtreeIsInSt
34010 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
34020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34030 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34040 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
34050 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d  ->pBt && p->pBt-
34060 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >inStmt);.}../*.
34070 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
34080 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72  ro if a read (or
34090 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
340a0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
340b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
340c0 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
340d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
340e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
340f0 65 78 5f 68 65 6c 64 28 70 2d 3e 70 53 71 6c 69  ex_held(p->pSqli
34100 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  te->mutex) );.  
34110 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d  return (p && (p-
34120 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
34130 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NONE));.}../*.**
34140 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
34150 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
34160 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65   to a blob of me
34170 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
34180 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  with.** a single
34190 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54   shared-btree. T
341a0 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  he memory is use
341b0 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65  d by client code
341c0 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a 2a   for it's own.**
341d0 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65   purposes (for e
341e0 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65  xample, to store
341f0 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63   a high-level sc
34200 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20  hema associated 
34210 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61  with .** the sha
34220 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20  red-btree). The 
34230 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61  btree layer mana
34240 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ges reference co
34250 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a  unting issues..*
34260 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
34270 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ime this is call
34280 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62  ed on a shared-b
34290 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74  tree, nBytes byt
342a0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
342b0 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a  are allocated, z
342c0 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72  eroed, and retur
342d0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
342e0 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73  r. For each subs
342f0 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20  equent .** call 
34300 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d  the nBytes param
34310 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
34320 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
34330 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a   the same blob.*
34340 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75  * of memory retu
34350 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73  rned. .**.** Jus
34360 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61  t before the sha
34370 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f  red-btree is clo
34380 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
34390 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
343a0 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65  .** xFree argume
343b0 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f  nt when the memo
343c0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61  ry allocation wa
343d0 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65  s made is invoke
343e0 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f  d on the .** blo
343f0 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d  b of allocated m
34400 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63  emory. This func
34410 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
34420 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
34430 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65  e().** on the me
34440 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20  mory, the btree 
34450 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e  layer does that.
34460 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
34470 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72  3BtreeSchema(Btr
34480 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ee *p, int nByte
34490 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28  s, void(*xFree)(
344a0 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68  void *)){.  BtSh
344b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
344c0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
344d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
344e0 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  ( !pBt->pSchema 
344f0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68  ){.    pBt->pSch
34500 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ema = sqlite3Mal
34510 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b  locZero(nBytes);
34520 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
34530 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20  chema = xFree;. 
34540 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
34550 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
34560 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  urn pBt->pSchema
34570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34580 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65  n true if anothe
34590 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73 61  r user of the sa
345a0 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  me shared btree 
345b0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  as the argument.
345c0 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  ** handle holds 
345d0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
345e0 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  k on the sqlite_
345f0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f  master table..*/
34600 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34610 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74  eSchemaLocked(Bt
34620 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
34630 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
34640 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34650 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d 75 74 65  p->pSqlite->mute
34660 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
34670 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
34680 72 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65  rc = (queryTable
34690 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
346a0 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
346b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73  =SQLITE_OK);.  s
346c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
346d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
346e0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
346f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
34700 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
34710 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
34720 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
34730 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
34740 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
34750 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
34760 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
34770 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
34780 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
34790 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
347a0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
347b0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
347c0 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
347d0 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
347e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
347f0 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28   u8 lockType = (
34800 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54  isWriteLock?WRIT
34810 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b  E_LOCK:READ_LOCK
34820 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
34830 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
34840 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
34850 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
34860 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
34870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34880 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
34890 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
348a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
348b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
348c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
348d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
348e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
348f0 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
34900 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
34910 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
34920 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
34930 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
34940 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
34950 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
34960 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
34970 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
34980 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
34990 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
349a0 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
349b0 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
349c0 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
349d0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
349e0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
349f0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
34a00 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
34a10 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
34a20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34a30 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
34a40 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
34a50 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
34a60 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28  d *z){.  assert(
34a70 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
34a80 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73  x(pCsr) );.  ass
34a90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
34aa0 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42  ex_held(pCsr->pB
34ab0 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 2d 3e 6d  tree->pSqlite->m
34ac0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
34ad0 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c  t(pCsr->isIncrbl
34ae0 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66 28  obHandle);.  if(
34af0 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCsr->eState>=C
34b00 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
34b10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73  K ){.    if( pCs
34b20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
34b30 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
34b40 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e 73 6b   return pCsr->sk
34b50 69 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ip;.    }else{. 
34b60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34b70 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a  TE_ABORT;.    }.
34b80 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
34b90 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69 6f  some preconditio
34ba0 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29 20  ns: .  **   (a) 
34bb0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
34bc0 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a  en for writing,.
34bd0 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72 65    **   (b) there
34be0 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b   is no read-lock
34bf0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   on the table be
34c00 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  ing modified and
34c10 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65 20  .  **   (c) the 
34c20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  cursor points at
34c30 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66 20   a valid row of 
34c40 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e  an intKey table.
34c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 43 73  .  */.  if( !pCs
34c60 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
34c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
34c80 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61  EADONLY;.  }.  a
34c90 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e 70 42  ssert( !pCsr->pB
34ca0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20  t->readOnly .   
34cb0 20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e         && pCsr->
34cc0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
34cd0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
34ce0 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  );.  if( checkRe
34cf0 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42  adLocks(pCsr->pB
34d00 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f  tree, pCsr->pgno
34d10 52 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b 0a 20  Root, pCsr) ){. 
34d20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34d30 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
34d40 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
34d50 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
34d60 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
34d70 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCsr->eState==
34d80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
34d90 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e  | !pCsr->pPage->
34da0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
34db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
34dc0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
34dd0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
34de0 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Csr, offset, amt
34df0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
34e00 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a   *)z, 0, 1);.}..
34e10 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  /* .** Set a fla
34e20 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  g on this cursor
34e30 20 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f   to cache the lo
34e40 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73  cations of pages
34e50 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76   from the .** ov
34e60 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20  erflow list for 
34e70 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
34e80 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
34e90 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
34ea0 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74  ** for increment
34eb0 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e  al blob IO only.
34ec0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
34ed0 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67  tion sets a flag
34ee0 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61   only. The actua
34ef0 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  l page location 
34f00 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64  cache.** (stored
34f10 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76   in BtCursor.aOv
34f20 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c  erflow[]) is all
34f30 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20  ocated and used 
34f40 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  by function.** a
34f50 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28  ccessPayload() (
34f60 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74  the worker funct
34f70 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42  ion for sqlite3B
34f80 74 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a  treeData() and.*
34f90 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75  * sqlite3BtreePu
34fa0 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69  tData())..*/.voi
34fb0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 61  d sqlite3BtreeCa
34fc0 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75  cheOverflow(BtCu
34fd0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
34fe0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
34ff0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35000 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35010 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
35020 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c  ur->pBtree->pSql
35030 69 74 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ite->mutex) );. 
35040 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 69   assert(!pCur->i
35050 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29  sIncrblobHandle)
35060 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72  ;.  assert(!pCur
35070 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
35080 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
35090 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65  Handle = 1;.}.#e
350a0 6e 64 69 66 0a                                   ndif.