/ Hex Artifact Content
Login

Artifact e5bfe007a4c4f643cb69426e6af0a9e556352f5b:


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 35 34 37 20 32 30 30 38 2f 31  c,v 1.547 2008/1
0190: 32 2f 31 30 20 32 31 3a 31 39 3a 35 37 20 64 72  2/10 21:19:57 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
0420: 20 53 6f 6d 65 74 69 6d 65 73 20 77 65 20 6e 65   Sometimes we ne
0430: 65 64 20 61 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e  ed a small amoun
0440: 74 20 6f 66 20 63 6f 64 65 20 73 75 63 68 20 61  t of code such a
0450: 73 20 61 20 76 61 72 69 61 62 6c 65 20 69 6e 69  s a variable ini
0460: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74  tialization.** t
0470: 6f 20 73 65 74 75 70 20 66 6f 72 20 61 20 6c 61  o setup for a la
0480: 74 65 72 20 61 73 73 65 72 74 28 29 20 73 74 61  ter assert() sta
0490: 74 65 6d 65 6e 74 2e 20 20 57 65 20 64 6f 20 6e  tement.  We do n
04a0: 6f 74 20 77 61 6e 74 20 74 68 69 73 20 63 6f 64  ot want this cod
04b0: 65 20 74 6f 0a 2a 2a 20 61 70 70 65 61 72 20 77  e to.** appear w
04c0: 68 65 6e 20 61 73 73 65 72 74 28 29 20 69 73 20  hen assert() is 
04d0: 64 69 73 61 62 6c 65 64 2e 20 20 54 68 65 20 66  disabled.  The f
04e0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 69  ollowing macro i
04f0: 73 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 75  s therefore.** u
0500: 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
0510: 68 61 74 20 73 65 74 75 70 20 63 6f 64 65 2e 20  hat setup code. 
0520: 20 54 68 65 20 22 56 56 41 22 20 61 63 72 6f 6e   The "VVA" acron
0530: 79 6d 20 73 74 61 6e 64 73 20 66 6f 72 0a 2a 2a  ym stands for.**
0540: 20 22 56 65 72 69 66 69 63 61 74 69 6f 6e 2c 20   "Verification, 
0550: 56 61 6c 69 64 61 74 69 6f 6e 2c 20 61 6e 64 20  Validation, and 
0560: 41 63 63 72 65 64 69 74 61 74 69 6f 6e 22 2e 20  Accreditation". 
0570: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
0580: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
0590: 68 69 6e 20 56 56 41 5f 4f 4e 4c 59 28 29 20 77  hin VVA_ONLY() w
05a0: 69 6c 6c 20 6f 6e 6c 79 20 72 75 6e 20 64 75 72  ill only run dur
05b0: 69 6e 67 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ing verification
05c0: 20 70 72 6f 63 65 73 73 65 73 2e 0a 2a 2f 0a 23   processes..*/.#
05d0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 20  ifndef NDEBUG.# 
05e0: 64 65 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 28  define VVA_ONLY(
05f0: 58 29 20 20 58 0a 23 65 6c 73 65 0a 23 20 64 65  X)  X.#else.# de
0600: 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 28 58 29  fine VVA_ONLY(X)
0610: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 6e 64  .#endif....#ifnd
0620: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0630: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
0640: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
0650: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0660: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0670: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0680: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0690: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
06a0: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
06b0: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
06c0: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
06d0: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
06e0: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
06f0: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
0700: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
0710: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f   test builds..*/
0720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0730: 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a 53 51  EST.BtShared *SQ
0740: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
0750: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
0760: 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
0770: 63 20 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49  c BtShared *SQLI
0780: 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68  TE_WSD sqlite3Sh
0790: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
07a0: 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  0;.#endif.#endif
07b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
07c0: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
07d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
07e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
07f0: 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  E./*.** Enable o
0800: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 68  r disable the sh
0810: 61 72 65 64 20 70 61 67 65 72 20 61 6e 64 20 73  ared pager and s
0820: 63 68 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a  chema features..
0830: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0840: 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ne has no effect
0850: 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   on existing dat
0860: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0870: 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  s..** The shared
0880: 20 63 61 63 68 65 20 73 65 74 74 69 6e 67 20 65   cache setting e
0890: 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75  ffects only futu
08a0: 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  re calls to.** s
08b0: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73  qlite3_open(), s
08c0: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c  qlite3_open16(),
08d0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   or sqlite3_open
08e0: 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _v2()..*/.int sq
08f0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
0900: 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e  red_cache(int en
0910: 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  able){.  sqlite3
0920: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
0930: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
0940: 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75  = enable;.  retu
0950: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0960: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46  #endif.../*.** F
0970: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0980: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
0990: 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
09a0: 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74  Btree*, Pgno, Bt
09b0: 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a  Cursor*, i64);..
09c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
09d0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
09e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
09f0: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0a00: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0a10: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
0a20: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
0a30: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a40: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a60: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a70: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a80: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a90: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0aa0: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0ab0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0ac0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0ad0: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0ae0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0af0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0b00: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0b10: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0b20: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0b30: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b40: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b50: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b60: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b70: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b80: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b90: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
0ba0: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0bb0: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
0bc0: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0bd0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0be0: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0bf0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0c00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0c10: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0c20: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0c30: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0c40: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0c50: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0c60: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0c70: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0c80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0c90: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0ca0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0cb0: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0cc0: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0cd0: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0ce0: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0cf0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0d00: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0d10: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0d20: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0d30: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0d40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0d50: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0d60: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0d70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0d80: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0d90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0da0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0db0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0dc0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0dd0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0de0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
0df0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
0e00: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
0e10: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
0e20: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
0e30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0e40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
0e50: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
0e60: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
0e70: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
0e80: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
0e90: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
0ea0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
0eb0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
0ec0: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
0ed0: 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  && pBt->pExclusi
0ee0: 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74  ve!=p ){.    ret
0ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0f00: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
0f10: 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f  s (along with lo
0f20: 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68  ckTable()) is wh
0f30: 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ere the ReadUnco
0f40: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a  mmitted flag is.
0f50: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e    ** dealt with.
0f60: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
0f70: 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61  s querying for a
0f80: 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74   read-lock and t
0f90: 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20  he flag is.  ** 
0fa0: 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e  set, it is uncon
0fb0: 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74  ditionally grant
0fc0: 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65  ed - even if the
0fd0: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
0fe0: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
0ff0: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
1000: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
1010: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
1020: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
1030: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
1040: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
1050: 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54  n function lockT
1060: 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61  able(), if a rea
1070: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
1080: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
1090: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
10a0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
10b0: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
10c0: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
10d0: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
10e0: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
10f0: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
1100: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
1110: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1120: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
1130: 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20  cursors do.  ** 
1140: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
1150: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
1160: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70  s. The locking p
1170: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a  rocedure for a .
1180: 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f    ** write-curso
1190: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
11a0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
11b0: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
11c0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
11d0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
11e0: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
11f0: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
1200: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
1210: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1220: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1230: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1240: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1250: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1260: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
1270: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a  Table==iTab && .
1280: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
1290: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c  ->eLock!=eLock |
12a0: 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f  | eLock!=READ_LO
12b0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  CK) ){.        r
12c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
12d0: 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
12e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1300: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1310: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1320: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1330: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1340: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
1350: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
1360: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
1370: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
1380: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
1390: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
13a0: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
13b0: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
13c0: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
13d0: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
13e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13f0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1400: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1410: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
1420: 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ly. SQLITE_BUSY 
1430: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  and.** SQLITE_NO
1440: 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  MEM may also be 
1450: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1460: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c  tic int lockTabl
1470: 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
1480: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1490: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
14a0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14b0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
14c0: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
14d0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
14e0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
14f0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1500: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1510: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
1520: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
1530: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
1540: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
1550: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1560: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1570: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1580: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1590: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
15a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
15c0: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c  TE_OK==queryTabl
15d0: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
15e0: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
15f0: 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63   If the read-unc
1600: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1610: 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d   set and a read-
1620: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
1630: 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65  d,.  ** return e
1640: 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64  arly without add
1650: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
1660: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
1670: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1680: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1690: 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65  ction queryTable
16a0: 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20  Lock() for more 
16b0: 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67  info on handling
16c0: 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55   .  ** the ReadU
16d0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e  ncommitted flag.
16e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
16f0: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53   (p->db->flags&S
1700: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1710: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
1720: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1730: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
1740: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1750: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1760: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1770: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1780: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1790: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
17a0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
17b0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
17c0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
17d0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
17e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
17f0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1800: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
1810: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
1820: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
1830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1840: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1850: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
1860: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
1870: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1880: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1890: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
18a0: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
18b0: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
18c0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
18d0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
18e0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
18f0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
1900: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
1910: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
1920: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
1930: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1950: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
1960: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
1970: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
1980: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
1990: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
19a0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
19b0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
19c0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
19d0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
19e0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
19f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1a00: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
1a10: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1a20: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
1a30: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
1a40: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
1a50: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
1a60: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
1a70: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
1a80: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
1a90: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
1aa0: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
1ab0: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
1ac0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
1ad0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
1ae0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
1af0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
1b00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1b10: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
1b20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1b30: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
1b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1b50: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
1b60: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
1b70: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
1b80: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
1b90: 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54  lls to the lockT
1ba0: 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64  able().** proced
1bb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1bc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
1bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1be0: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65  ckAllTables(Btre
1bf0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1c00: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c10: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
1c20: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
1c30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1c40: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1c50: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1c60: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1c70: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1c80: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1c90: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
1ca0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
1cb0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1cc0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1cd0: 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75  0 || pBt->pExclu
1ce0: 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  sive==pLock->pBt
1cf0: 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ree );.    if( p
1d00: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
1d10: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
1d20: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
1d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1d40: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
1d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
1d60: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
1d70: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
1d80: 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c    if( pBt->pExcl
1d90: 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20  usive==p ){.    
1da0: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
1db0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
1dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1dd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1de0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1df0: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1e00: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
1e10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1e20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
1e30: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
1e40: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
1e50: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
1e60: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1e70: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
1e80: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
1e90: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
1ea0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1eb0: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
1ec0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
1ed0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1ee0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1ef0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1f00: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1f10: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1f20: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
1f30: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
1f40: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
1f50: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
1f60: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1f70: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f80: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1fa0: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
1fb0: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
1fc0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
1fd0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
1fe0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1ff0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
2000: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
2010: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
2020: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
2030: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
2040: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
2050: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2060: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
2070: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2080: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2090: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20b0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
20c0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
20d0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
20e0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
20f0: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
2100: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
2110: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
2120: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
2130: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
2140: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
2150: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
2160: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2170: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
2180: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
2190: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
21a0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
21b0: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
21c0: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
21d0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
21e0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
21f0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2200: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2210: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
2220: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2230: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2240: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
2250: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
2260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
2270: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2280: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
2290: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
22a0: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
22b0: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
22c0: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
22d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
22e0: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
22f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
2300: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
2310: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
2320: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
2330: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
2340: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
2350: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
2360: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
2370: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
2380: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
2390: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
23a0: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
23b0: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
23c0: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
23d0: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
23e0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
23f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
2400: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2410: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
2420: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
2430: 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43  3Malloc( (int)pC
2440: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
2450: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
2460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2470: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
2480: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
2490: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
24a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
24c0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
24d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24f0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
2500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2520: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
2530: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
2540: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
2550: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
2560: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2580: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2590: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
25a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
25b0: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
25c0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
25d0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
25e0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
25f0: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
2600: 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  1;.    pCur->eSt
2610: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
2620: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
2630: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
2640: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
2650: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2660: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
2670: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
2680: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
2690: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
26a0: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
26b0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
26c0: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
26d0: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
26e0: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
26f0: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
2700: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
2710: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
2720: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
2730: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
2740: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
2750: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
2760: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
2770: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
2780: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
27c0: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
27d0: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
27e0: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
27f0: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2800: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2810: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
2820: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
2830: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
2840: 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20  =iRoot) && .    
2850: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43      p->eState==C
2860: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2870: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
2880: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2890: 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  (p);.      if( S
28a0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
28b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
28c0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
28d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
28e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28f0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
2900: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2910: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2920: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
2930: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
2940: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
2950: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2960: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
2970: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
2980: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
2990: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
29a0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29b0: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
29c0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
29d0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
29e0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
29f0: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
2a00: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
2a10: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
2a20: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
2a30: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
2a40: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
2a50: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
2a60: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
2a70: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
2a80: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
2a90: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
2aa0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
2ab0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
2ac0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
2ad0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
2ae0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
2af0: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  tion()..*/.int s
2b00: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2b10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2b20: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b30: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
2b40: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b50: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b70: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2b80: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2b90: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ba0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2bb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
2bc0: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
2bd0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2be0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2bf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c00: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
2c10: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
2c20: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
2c30: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
2c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c60: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
2c70: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2c80: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c90: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ca0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2cb0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2cc0: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
2cd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
2ce0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
2cf0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
2d00: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
2d10: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2d20: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
2d30: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2d40: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2d50: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
2d60: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
2d70: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
2d80: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
2d90: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
2da0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
2db0: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
2dc0: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
2dd0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
2de0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
2df0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
2e00: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
2e10: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
2e20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e30: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
2e40: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
2e50: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
2e60: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
2e70: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
2e80: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
2e90: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
2ea0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
2eb0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ec0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
2ed0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
2ee0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
2ef0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2f00: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
2f10: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2f20: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2f30: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
2f40: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
2f50: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
2f60: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f70: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2f80: 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20  ->skip!=0 ){.   
2f90: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
2fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2fb0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2fd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
2fe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ff0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
3000: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
3010: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
3020: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
3030: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
3040: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3050: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
3060: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3070: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
3080: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
3090: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
30a0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
30b0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
30c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
30d0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
30e0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
30f0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
3100: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3110: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3120: 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50  ex) );.  nPagesP
3130: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
3140: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
3150: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
3160: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
3170: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
3180: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
3190: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
31a0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
31b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
31d0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
31e0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
31f0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
3200: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
3210: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
3220: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
3230: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
3240: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
3250: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
3260: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
3270: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
3280: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
3290: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41  ber 'pgno'..** A
32a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
32b0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
32c0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
32d0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
32e0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
32f0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42   int ptrmapPut(B
3300: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
3310: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
3320: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a  , Pgno parent){.
3330: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
3340: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
3350: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
3360: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3370: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
3380: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
3390: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
33a0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
33b0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
33d0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
33e0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
33f0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
3400: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
3410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
3440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
3450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
3460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
3470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
3480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
3490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
34a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
34c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
34d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
34e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey==0 ){.    ret
34f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3500: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
3510: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
3520: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
3530: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3540: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
3550: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
3560: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
3570: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3580: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
3590: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
35a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
35b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
35c0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
35d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
35e0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
35f0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3600: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3610: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3620: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3630: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3640: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3650: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3660: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3670: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
3680: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
3690: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
36a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
36c0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
36d0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
36e0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
36f0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3710: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3720: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3730: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3740: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3750: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3760: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3770: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
3780: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3790: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
37a0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
37b0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
37c0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
37d0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
37e0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
37f0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3800: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3810: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3820: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3830: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3850: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3860: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3870: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
3880: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
3890: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
38a0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
38b0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
38c0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
38d0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
38e0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
38f0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3900: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3910: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3920: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3930: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3940: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3950: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3960: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3970: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3980: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
3990: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
39a0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
39b0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
39c0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
39d0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
39e0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
39f0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3a00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3a10: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3a20: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3a30: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3a40: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3a50: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
3a60: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61  trmap, key);.  a
3a70: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
3a80: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
3a90: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
3aa0: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
3ab0: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
3ac0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3ad0: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
3ae0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
3af0: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
3b00: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
3b10: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
3b20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
3b30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3b40: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
3b50: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
3b60: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
3b70: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
3b80: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
3b90: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
3ba0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
3bb0: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
3bc0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
3bd0: 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20  mapPutOvfl(y,z) 
3be0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
3bf0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
3c00: 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61  btree page and a
3c10: 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d   cell index (0 m
3c20: 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  eans the first c
3c30: 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  ell on.** the pa
3c40: 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20  ge, 1 means the 
3c50: 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64  second cell, and
3c60: 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72   so forth) retur
3c70: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
3c80: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
3c90: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
3ca0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
3cb0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
3cc0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
3cd0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
3ce0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
3cf0: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
3d00: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
3d10: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
3d20: 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61  byte(&(P)->aData
3d30: 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  [(P)->cellOffset
3d40: 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a  +2*(I)])))../*.*
3d50: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
3d60: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
3d70: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
3d80: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
3d90: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
3da0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
3db0: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
3dc0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
3dd0: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
3de0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
3df0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
3e00: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
3e10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3e20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
3e30: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
3e40: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3e50: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3e60: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
3e70: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
3e80: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
3e90: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
3ea0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
3eb0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
3ec0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
3ed0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
3ee0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3ef0: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3f10: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3f20: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
3f30: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
3f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3f50: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
3f60: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
3f70: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
3f80: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
3f90: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
3fa0: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
3fb0: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
3fc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
3fd0: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
3fe0: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
3ff0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
4000: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4010: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
4020: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
4030: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
4040: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
4050: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
4060: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
4070: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
4080: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
4090: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
40a0: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
40b0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
40c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
40d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
40e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
40f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4100: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
4120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
4130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
4140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
4150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
4160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
4180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
4190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
41a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
41b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
41c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
41d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
41e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
41f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
4200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
4210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
4220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
4240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
4250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
4270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
4280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
4290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
42a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
42b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
42c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
42d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
42e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
42f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
4300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
4310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
4320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
4330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
4340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
4350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
4360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
4370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
4380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
4390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
43a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
43b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
43c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
43d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
43e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
43f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
4400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
4410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
4420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
4430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
4440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
4450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
4460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66  Header = n;.  if
4470: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
4480: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
4490: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
44a0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
44b0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
44c0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
44d0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
44e0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
44f0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
4500: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
4510: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
4520: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
4530: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
4540: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
4550: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
4560: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
4570: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
4580: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
4590: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
45a0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
45b0: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
45c0: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
45d0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
45e0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
45f0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
4600: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4610: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
4620: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
4630: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
4640: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
4650: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
4660: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
4670: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
4680: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
4690: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
46a0: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
46b0: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
46c0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
46d0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
46e0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
46f0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
4700: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
4710: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
4720: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
4730: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
4740: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
4750: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
4760: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
4770: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
4780: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
4790: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
47a0: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
47b0: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
47c0: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
47d0: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
47e0: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
47f0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
4800: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
4810: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
4820: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
4830: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4840: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
4850: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
4860: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
4870: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4880: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
4890: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
48a0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
48b0: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
48c0: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
48d0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
48e0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
48f0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
4900: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
4910: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
4920: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
4930: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
4940: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
4950: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28  ze - 4);.    if(
4960: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
4970: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
4980: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
4990: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
49a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
49b0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
49c0: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
49d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
49e0: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
49f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
4a00: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
4a10: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
4a20: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
4a30: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
4a40: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4a50: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
4a60: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4a70: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
4a80: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
4a90: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
4aa0: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
4ab0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
4ac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
4ad0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
4ae0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
4af0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
4b00: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
4b10: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
4b20: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
4b30: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
4b40: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
4b50: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
4b60: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
4b70: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
4b80: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
4b90: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
4ba0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
4bb0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4bc0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
4bd0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
4be0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
4bf0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
4c00: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
4c10: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
4c20: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
4c30: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
4c40: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
4c50: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
4c60: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
4c70: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
4c80: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
4c90: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4ca0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
4cb0: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
4cc0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
4cd0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4ce0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4cf0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4d00: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
4d10: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
4d20: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
4d30: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
4d40: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4d50: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4d60: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4d70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4d80: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4d90: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4da0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4db0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
4dc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4dd0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
4de0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
4df0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
4e00: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4e10: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4e20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4e30: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4e40: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4e50: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4e60: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4e80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
4e90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4ea0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4eb0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
4ec0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
4ed0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4ee0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4ef0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
4f10: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4f20: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4f30: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4f40: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
4f50: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4f60: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4f70: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
4f80: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
4f90: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
4fa0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
4fb0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
4fc0: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
4fd0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
4fe0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
4ff0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
5000: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5010: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
5020: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
5030: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
5040: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
5050: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
5060: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
5070: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
5080: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
5090: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
50a0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
50b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
50c0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
50d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
50e0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
50f0: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
5100: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5110: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5120: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
5130: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
5140: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
5150: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
5160: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
5170: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
5180: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
5190: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
51a0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
51b0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
51c0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
51d0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
51e0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
51f0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
5200: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
5210: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
5220: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
5230: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
5240: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
5250: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5260: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
5270: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
5280: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
5290: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
52c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
52f0: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
5300: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5320: 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
5330: 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20  byte after cell 
5340: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
5350: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5370: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
5380: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
5390: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
53a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
53b0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
53c0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
53d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
53e0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
53f0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
5400: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
5410: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
5420: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
5430: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
5440: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
5450: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
5460: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
5470: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
5480: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
5490: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
54b0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
54c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
54d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
54e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
54f0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
5500: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
5510: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
5520: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
5530: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
5540: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5550: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5560: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5570: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5580: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
5590: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
55a0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
55b0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
55c0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
55d0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
55e0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
55f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5600: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
5610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
5620: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
5630: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
5640: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
5650: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
5660: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
5670: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
5680: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
5690: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
56a0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
56b0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
56c0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
56d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
56e0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
56f0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
5700: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
5710: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
5720: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
5730: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
5740: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
5750: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
5760: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
5770: 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d  leSize;.  for(i=
5780: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
5790: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
57a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
57b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
57c0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
57d0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
57e0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
57f0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
5800: 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62      if( pc>=usab
5810: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
5820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
5830: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
5840: 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  }.    size = cel
5850: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
5860: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
5870: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
5880: 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f    if( cbrk<cellO
5890: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c  ffset+2*nCell ||
58a0: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
58b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
58c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
58d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
58e0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
58f0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
5900: 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20   && cbrk>=0 );. 
5910: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5920: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
5930: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
5940: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
5950: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
5960: 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  ( cbrk>=cellOffs
5970: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
5980: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5990: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
59a0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
59b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
59c0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
59d0: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
59e0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
59f0: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
5a00: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72  ta[addr], 0, cbr
5a10: 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72  k-addr);.  asser
5a20: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
5a30: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
5a40: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
5a50: 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70  if( cbrk-addr!=p
5a60: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
5a70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5a90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5aa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5ab0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
5ac0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e  ytes of space on
5ad0: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52   a page..**.** R
5ae0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
5af0: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
5b00: 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74  a[] of the first
5b10: 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
5b20: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
5b30: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
5b40: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
5b50: 65 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73  e is enough.** s
5b60: 70 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74  pace.  This rout
5b70: 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66  ine will never f
5b80: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ail..**.** If th
5b90: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  e page contains 
5ba0: 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73  nBytes of free s
5bb0: 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f  pace but does no
5bc0: 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79  t contain.** nBy
5bd0: 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75  tes of contiguou
5be0: 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68  s free space, th
5bf0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5c00: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a  automatically.**
5c10: 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65   calls defrageme
5c20: 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73  ntPage() to cons
5c30: 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65  olidate all free
5c40: 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a   space before .*
5c50: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  * allocating the
5c60: 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73   new chunk..*/.s
5c70: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
5c80: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
5c90: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
5ca0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
5cb0: 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73  pc, hdr;.  int s
5cc0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67  ize;.  int nFrag
5cd0: 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69  ;.  int top;.  i
5ce0: 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
5cf0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e  cellOffset;.  un
5d00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5d10: 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70  a;.  .  data = p
5d20: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61  Page->aData;.  a
5d30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
5d40: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
5d50: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
5d60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5d70: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
5d80: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5d90: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5da0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
5db0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
5dc0: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
5dd0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
5de0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5df0: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
5e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5e10: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
5e20: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
5e30: 65 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b  e -= (u16)nByte;
5e40: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5e50: 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46  hdrOffset;..  nF
5e60: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
5e70: 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36  ];.  if( nFrag<6
5e80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
5e90: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ch the freelist 
5ea0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
5eb0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
5ec0: 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 20   satisfy the.   
5ed0: 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65 73   ** space reques
5ee0: 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  t. */.    addr =
5ef0: 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c   hdr+1;.    whil
5f00: 65 28 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  e( (pc = get2byt
5f10: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
5f20: 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20  0 ){.      size 
5f30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5f40: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
5f50: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
5f60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
5f70: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
5f90: 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20  <nByte+4 ){.    
5fa0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
5fb0: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
5fc0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
5fd0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
5fe0: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
5ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
6000: 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn pc;.        }
6010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6020: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6030: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
6040: 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20      return pc + 
6050: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
6060: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
6070: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
6080: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
6090: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
60a0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
60b0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
60c0: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
60d0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
60e0: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
60f0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6100: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
6110: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
6120: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
6130: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
6140: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
6150: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
6160: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
6170: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
6180: 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61  yte ){.    defra
6190: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
61a0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
61b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
61c0: 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d  ]);.  }.  top -=
61d0: 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74   nByte;.  assert
61e0: 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ( cellOffset + 2
61f0: 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b  *nCell <= top );
6200: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6210: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
6220: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6230: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6240: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6250: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  ) );.  return to
6260: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6270: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
6280: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
6290: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
62a0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
62b0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
62c0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
62d0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
62e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
62f0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
6300: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
6310: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
6320: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
6330: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
6340: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
6350: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
6360: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
6370: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
6380: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
6390: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
63a0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
63b0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
63c0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
63d0: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
63e0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
63f0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
6400: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
6410: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
6420: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
6430: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
6440: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
6450: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
6460: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
6470: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
6480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
6490: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
64a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
64b0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
64c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
64d0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
64e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
64f0: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
6500: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
6510: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
6520: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
6530: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
6540: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
6550: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
6560: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
6570: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
6580: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
6590: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
65a0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
65b0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
65c0: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
65d0: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
65e0: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
65f0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
6600: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
6610: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
6620: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
6630: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
6640: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
6650: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6660: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
6670: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
6680: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
6690: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
66a0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
66b0: 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64   if( pbegin<=add
66c0: 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  r ) {.      retu
66d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
66e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
66f0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6700: 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67  .  }.  if ( pbeg
6710: 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  in>pPage->pBt->u
6720: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a  sableSize-4 ) {.
6730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6740: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6750: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
6760: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
6770: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
6780: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6790: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
67a0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
67b0: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
67c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
67d0: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
67e0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
67f0: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
6800: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
6810: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
6820: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
6830: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
6840: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
6850: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6860: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
6870: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
6880: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
6890: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
68a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
68b0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
68c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
68d0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
68e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
68f0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
6900: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
6910: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
6920: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
6930: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
6940: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
6950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
6960: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
6970: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
6980: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
6990: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
69a0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
69b0: 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t+7]) ){.       
69c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
69d0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
69e0: 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b     }.      data[
69f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6a00: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
6a10: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
6a20: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
6a30: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
6a40: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
6a50: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
6a60: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
6a70: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
6a80: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
6a90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6aa0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
6ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6ac0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6ad0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6ae0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6af0: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
6b00: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
6b10: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
6b20: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
6b30: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
6b40: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
6b50: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
6b60: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
6b70: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6b80: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
6b90: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
6ba0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
6bb0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
6bc0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6bd0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
6be0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6bf0: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
6c00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6c10: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
6c20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6c30: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6c40: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6c50: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6c60: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6c70: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
6c80: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
6c90: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
6ca0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
6cb0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
6cc0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
6cd0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
6ce0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
6cf0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
6d00: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
6d10: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
6d20: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
6d30: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
6d40: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
6d50: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
6d60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6d70: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
6d80: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
6d90: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
6da0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
6db0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
6dc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6dd0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6de0: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
6df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6e00: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
6e10: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
6e20: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
6e30: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
6e40: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
6e50: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
6e60: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
6e70: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
6e80: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
6e90: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6ea0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6eb0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6ec0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
6ed0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
6ee0: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
6ef0: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
6f00: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
6f10: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
6f20: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
6f30: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
6f40: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
6f50: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
6f60: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
6f70: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
6f80: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
6f90: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
6fa0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
6fb0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
6fc0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
6fd0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
6fe0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
6ff0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
7000: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
7010: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
7020: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
7030: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
7040: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
7050: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
7060: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
7070: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
7080: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
7090: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
70a0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
70b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
70c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
70d0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
70e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
70f0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7100: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
7110: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
7120: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
7130: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
7140: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
7150: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
7160: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
7170: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
7180: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
7190: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
71a0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
71b0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
71c0: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
71d0: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
71e0: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
71f0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
7200: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
7210: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
7220: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
7230: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
7240: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
7250: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
7260: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
7270: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
7280: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
7290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
72a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
72b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
72c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
72d0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
72e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
72f0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
7300: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7310: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
7320: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7330: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7350: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
7360: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7370: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7380: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
7390: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
73a0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
73b0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
73c0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
73d0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
73e0: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
73f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
7400: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
7410: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
7420: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
7430: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
7440: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
7450: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
7460: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
7470: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
7480: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
7490: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
74a0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
74b0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
74c0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
74d0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
74e0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
74f0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
7500: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
7510: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
7520: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
7530: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7540: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7550: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
7560: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
7570: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
7580: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
7590: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
75a0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
75b0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
75c0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
75d0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
75e0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
75f0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
7600: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
7610: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
7620: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7630: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
7640: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
7650: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
7660: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
7670: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
7680: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
7690: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
76a0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
76b0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
76c0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
76d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
76e0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
76f0: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
7700: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
7710: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
7720: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7730: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
7740: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
7750: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
7760: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
7770: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
7780: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
7790: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
77a0: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
77b0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
77c0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
77d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
77e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
77f0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }.  .    /* Comp
7800: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
7810: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
7820: 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d  page */.    pc =
7830: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7840: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
7850: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
7860: 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66   + top - (cellOf
7870: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
7880: 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c  nCell);.    whil
7890: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
78a0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
78b0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
78c0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
78d0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
78e0: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
78f0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
7900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7910: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
7920: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
7930: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7940: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
7950: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7960: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
7970: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
7980: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
7990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
79a0: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
79b0: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
79c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  er */.        re
79d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
79e0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
79f0: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b   }.      nFree +
7a00: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  = size;.      pc
7a10: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
7a20: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
7a30: 3d 20 28 75 31 36 29 6e 46 72 65 65 3b 0a 20 20  = (u16)nFree;.  
7a40: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
7a50: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
7a60: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7a70: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7a80: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
7a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7ab0: 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a  ; .    }..#if 0.
7ac0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
7ad0: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
7ae0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
7af0: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
7b00: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
7b10: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
7b20: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
7b30: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
7b40: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
7b50: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
7b60: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
7b70: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
7b80: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
7b90: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
7ba0: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
7bb0: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
7bc0: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
7bd0: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
7be0: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
7bf0: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
7c00: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
7c10: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
7c20: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
7c30: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
7c40: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
7c50: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
7c60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
7c70: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
7c80: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
7c90: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
7ca0: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
7cb0: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
7cc0: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
7cd0: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
7ce0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
7cf0: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
7d00: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
7d10: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
7d20: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
7d30: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
7d40: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
7d50: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
7d60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7d70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7d80: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7d90: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
7da0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
7db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7dd0: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7de0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7df0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7e00: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7e10: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7e20: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7e30: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7e40: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7e50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7e60: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7e70: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7e80: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7e90: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
7ea0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
7eb0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
7ec0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7ed0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
7ee0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
7ef0: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
7f00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7f10: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
7f20: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
7f30: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
7f40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7f50: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
7f60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7f70: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
7f80: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7f90: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7fa0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7fc0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7fd0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d  utex) );.  /*mem
7fe0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
7ff0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
8000: 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64  ze - hdr);*/.  d
8010: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
8020: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
8030: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
8040: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
8050: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
8060: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
8070: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
8080: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
8090: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
80a0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
80b0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
80c0: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
80d0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
80e0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
80f0: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
8100: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
8110: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
8120: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
8130: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
8140: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
8150: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
8160: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
8170: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
8180: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
8190: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
81a0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
81b0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
81c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
81d0: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
81e0: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
81f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
8200: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
8210: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
8220: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
8230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
8240: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
8250: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
8260: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
8270: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
8280: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
8290: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
82a0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
82b0: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
82c0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
82d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
82e0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
82f0: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
8300: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
8310: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
8320: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
8330: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
8340: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
8350: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
8360: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
8370: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
8380: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
8390: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
83a0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
83b0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
83c0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
83d0: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
83e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
83f0: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
8400: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
8410: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
8420: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
8430: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
8440: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
8450: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
8460: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
8470: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
8480: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
8490: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
84a0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
84b0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
84c0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
84d0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
84e0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
84f0: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
8500: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
8510: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
8520: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
8530: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
8540: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
8550: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
8560: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
8570: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
8580: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
8590: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
85a0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
85b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
85c0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
85d0: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
85e0: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
85f0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
8600: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
8610: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
8620: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
8630: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
8640: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
8650: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8660: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8670: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
8680: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8690: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
86a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
86b0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
86c0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
86d0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
86e0: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
86f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8700: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
8710: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
8720: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
8730: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
8740: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8750: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8760: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
8770: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
8780: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
8790: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
87a0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
87b0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
87c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
87d0: 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o pagerPagecount
87e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
87f0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d  .  int nPage = -
8800: 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
8810: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
8820: 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  e1 );.  rc = sql
8830: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
8840: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
8850: 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  &nPage);.  asser
8860: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8870: 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b   || nPage==-1 );
8880: 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29  .  return (Pgno)
8890: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
88a0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
88b0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
88c0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
88d0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
88e0: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
88f0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
8900: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
8910: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
8920: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
8930: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
8940: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
8950: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
8960: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
8970: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
8980: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
8990: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
89a0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
89b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
89c0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
89d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
89e0: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
89f0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
8a00: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
8a10: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
8a20: 2a 70 44 62 50 61 67 65 3b 0a 20 20 4d 65 6d 50  *pDbPage;.  MemP
8a30: 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
8a40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8a50: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8a60: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
8a70: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
8a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8a90: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
8aa0: 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e    /* It is often
8ab0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
8ac0: 68 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20  he page we want 
8ad0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  is already in ca
8ae0: 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c  che..  ** If so,
8af0: 20 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79   get it directly
8b00: 2e 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73  .  This saves us
8b10: 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20   from having to 
8b20: 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50  call.  ** pagerP
8b30: 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61  agecount() to ma
8b40: 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20  ke sure pgno is 
8b50: 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77  within limits, w
8b60: 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a  hich results.  *
8b70: 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62  * in a measureab
8b80: 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  le performance i
8b90: 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a  mprovements..  *
8ba0: 2f 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  /.  pDbPage = sq
8bb0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
8bc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
8bd0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
8be0: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
8bf0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
8c00: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 2a 70 70  cache */.    *pp
8c10: 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62  Page = pPage = b
8c20: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
8c30: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
8c40: 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  , pBt);.    rc =
8c50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8c60: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  lse{.    /* Page
8c70: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20   not in cache.  
8c80: 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20  Acquire it. */. 
8c90: 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65     if( pgno>page
8ca0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
8cb0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8cd0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
8ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
8cf0: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
8d00: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
8d10: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
8d20: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
8d30: 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d  e = *ppPage;.  }
8d40: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
8d50: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20  sInit ){.    rc 
8d60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
8d70: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
8d80: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
8d90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
8da0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
8db0: 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  ;.    *ppPage = 
8dc0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8dd0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
8de0: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
8df0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
8e00: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
8e10: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
8e20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
8e30: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
8e40: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
8e50: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
8e60: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
8e70: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
8e80: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
8e90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8ea0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
8eb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8ec0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8ed0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
8ee0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
8ef0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8f00: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
8f10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
8f20: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
8f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8f40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8f50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8f60: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
8f70: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
8f80: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
8f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
8fa0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
8fb0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
8fc0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
8fd0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
8fe0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
8ff0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
9000: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
9010: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
9020: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
9030: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
9040: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
9050: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9060: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
9070: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
9080: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
9090: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
90a0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
90b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
90c0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
90d0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
90e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
90f0: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
9100: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
9110: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
9120: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
9130: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
9140: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
9150: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
9160: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9180: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9190: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
91a0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
91b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
91c0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
91d0: 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20 20 20  Data)>0 ){.     
91e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
91f0: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9200: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9210: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
9220: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
9230: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
9240: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
9250: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
9260: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
9270: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
9280: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
9290: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
92a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
92b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
92c0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
92d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
92e0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
92f0: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
9300: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
9310: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
9320: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
9330: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
9340: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
9350: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
9360: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
9370: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
9380: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
9390: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
93a0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
93b0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
93c0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
93d0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
93e0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
93f0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
9400: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9410: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
9420: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9430: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
9440: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
9450: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
9460: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
9470: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
9480: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
9490: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
94a0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
94b0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
94c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
94d0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
94e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
94f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
9500: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
9510: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
9520: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
9530: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9540: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
9550: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
9560: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9580: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
9590: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
95a0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
95b0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
95c0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
95d0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
95e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
95f0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
9600: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
9610: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
9620: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
9630: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
9640: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
9650: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
9660: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9670: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
9680: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
9690: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
96a0: 75 38 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  u8 nReserve;.  u
96b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
96c0: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  Header[100];..  
96d0: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
96e0: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
96f0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
9700: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
9710: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
9720: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
9730: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
9740: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
9750: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
9760: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
9770: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
9780: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
9790: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
97a0: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
97b0: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
97c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
97d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
97e0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
97f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9800: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
9810: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9820: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
9830: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
9840: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
9850: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
9860: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
9870: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
9880: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
9890: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
98a0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
98b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
98c0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
98d0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
98e0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
98f0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9900: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
9910: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
9920: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9930: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9940: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
9950: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
9960: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
9970: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9980: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9990: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
99a0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
99b0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
99c0: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
99d0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
99e0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
99f0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
9a00: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
9a10: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
9a20: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
9a30: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
9a40: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
9a50: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
9a60: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
9a70: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
9a80: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
9a90: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
9aa0: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
9ab0: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
9ac0: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
9ad0: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
9ae0: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
9af0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
9b00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
9b10: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
9b20: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9b30: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
9b40: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
9b50: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
9b60: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
9b70: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
9b80: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
9b90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
9ba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9bb0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
9bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9bd0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
9be0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
9bf0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
9c00: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
9c10: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
9c20: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
9c30: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
9c40: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9c50: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9c60: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
9c70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9c80: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
9c90: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
9ca0: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
9cb0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
9cc0: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
9cd0: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
9ce0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9cf0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
9d00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
9d10: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
9d20: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
9d30: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
9d40: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
9d50: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
9d60: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
9d70: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
9d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
9d90: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
9da0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
9db0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
9dc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9de0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9df0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
9e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9e10: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
9e20: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
9e30: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
9e40: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
9e50: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
9e60: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
9e70: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
9e80: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
9e90: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
9ea0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
9eb0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
9ec0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
9ed0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
9ee0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
9ef0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
9f00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
9f10: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
9f20: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
9f30: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
9f40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
9f50: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
9f60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
9f70: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
9f80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
9f90: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
9fa0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
9fb0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
9fc0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
9fd0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
9fe0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
9ff0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
a000: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
a010: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
a020: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
a030: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
a040: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
a050: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
a060: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a070: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
a080: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
a090: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a0a0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
a0b0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a0d0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
a0e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
a0f0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
a100: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
a110: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
a120: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
a130: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
a140: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
a150: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
a160: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a170: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
a180: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a190: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a1a0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
a1b0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
a1c0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
a1f0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
a200: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
a210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a220: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a230: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
a240: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
a250: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
a260: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
a270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a280: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a290: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
a2a0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
a2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
a2c0: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
a2d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
a2e0: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
a2f0: 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
a300: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
a310: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
a320: 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d  SetReiniter(pBt-
a330: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69  >pPager, pageRei
a340: 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  nit);.    pBt->p
a350: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
a360: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
a370: 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  .    pBt->readOn
a380: 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ly = sqlite3Page
a390: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
a3a0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
a3b0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65  t->pageSize = ge
a3c0: 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t2byte(&zDbHeade
a3d0: 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  r[16]);.    if( 
a3e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
a3f0: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
a400: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
a410: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
a420: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
a430: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
a440: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
a450: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
a460: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
a470: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
a480: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
a490: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
a4a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a4b0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
a4c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a4d0: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
a4e0: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
a4f0: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
a500: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
a510: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
a520: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
a530: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
a540: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
a550: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
a560: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
a570: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
a580: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
a590: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
a5a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
a5b0: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
a5c0: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
a5d0: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
a5e0: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
a5f0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
a600: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
a610: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
a620: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
a630: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
a640: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
a650: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
a660: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
a670: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
a680: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a690: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
a6a0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
a6b0: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
a6c0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
a6d0: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
a6e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a6f0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
a700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a710: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
a720: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
a730: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
a740: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
a750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a760: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
a770: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
a780: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
a790: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
a7a0: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
a7b0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
a7c0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
a7d0: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
a7e0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
a7f0: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
a800: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
a810: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
a820: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
a830: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
a840: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
a850: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
a860: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ageSize */.    s
a870: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a880: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
a890: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
a8a0: 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65  ze);.   .#if !de
a8b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a8c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a8d0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a8e0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a8f0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
a900: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
a910: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
a920: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
a930: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
a940: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
a950: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
a960: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
a970: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
a980: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
a990: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
a9a0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a9b0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a9c0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
a9e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
a9f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
aa00: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
aa10: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
aa20: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
aa30: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
aa40: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
aa50: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
aa60: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
aa70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
aa80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
aa90: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
aaa0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
aab0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
aac0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
aad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
aae0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
aaf0: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
ab00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
ab10: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
ab20: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ab30: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
ab40: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
ab50: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ab60: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
ab70: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
ab80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
ab90: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
aba0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
abb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
abc0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
abd0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
abe0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
abf0: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
ac00: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
ac10: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
ac20: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
ac30: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
ac40: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
ac50: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
ac60: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
ac70: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
ac80: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
ac90: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
aca0: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
acb0: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
acc0: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
acd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ace0: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
acf0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ad00: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ad10: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
ad20: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
ad30: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
ad40: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
ad50: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
ad60: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
ad70: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
ad80: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
ad90: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
ada0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
adb0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
adc0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
add0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ade0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
adf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae00: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
ae10: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
ae20: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
ae30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ae40: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
ae50: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
ae60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
ae70: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
ae80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
ae90: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
aea0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
aeb0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
aec0: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
aed0: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
aee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
aef0: 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
af00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
af20: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
af30: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
af40: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
af50: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
af60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
af70: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
af80: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
af90: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
afa0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
afb0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
afc0: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
afd0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
afe0: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
aff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
b010: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
b020: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
b030: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
b040: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
b050: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
b060: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
b070: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
b080: 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
b090: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
b0a0: 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
b0b0: 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
b0c0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
b0d0: 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
b0e0: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
b0f0: 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
b100: 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
b110: 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
b120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
b130: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
b140: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
b150: 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
b160: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
b170: 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
b180: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b190: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
b1a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
b1b0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
b1c0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
b1d0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
b1e0: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
b1f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
b200: 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
b210: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
b220: 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
b230: 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
b240: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
b250: 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
b260: 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
b270: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
b280: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
b290: 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
b2a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b2b0: 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
b2c0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
b2d0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
b2e0: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
b2f0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
b300: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
b310: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
b320: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
b330: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
b340: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
b350: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
b360: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
b370: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
b380: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
b390: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
b3a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b3b0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
b3c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
b3d0: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
b3e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
b3f0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
b400: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
b410: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
b420: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
b430: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
b440: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
b450: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
b460: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
b470: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
b480: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
b490: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
b4a0: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
b4b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
b4c0: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
b4d0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
b4e0: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
b4f0: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
b500: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
b510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
b520: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
b530: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
b540: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
b550: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
b560: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
b570: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
b580: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
b590: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
b5a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
b5b0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
b5c0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
b5d0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
b5e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b5f0: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
b600: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
b610: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
b620: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
b630: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
b640: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
b650: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
b660: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
b670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b680: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
b690: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
b6a0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
b6b0: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70  >db = p->db;.  p
b6c0: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
b6d0: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
b6e0: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
b6f0: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
b700: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
b710: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
b720: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
b730: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b740: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
b750: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
b760: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
b770: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
b780: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
b790: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
b7a0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
b7b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
b7c0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
b7d0: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
b7e0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
b7f0: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
b800: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
b810: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
b820: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b830: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
b840: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
b850: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
b860: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
b870: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
b880: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
b890: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
b8a0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
b8b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
b8c0: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
b8d0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
b8e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b8f0: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
b900: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
b910: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
b920: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
b930: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
b940: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
b950: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
b960: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
b970: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
b980: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
b990: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
b9a0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
b9b0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
b9c0: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
b9d0: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
b9e0: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
b9f0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
ba00: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
ba10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ba20: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
ba30: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
ba40: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
ba50: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
ba60: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
ba70: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
ba80: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
ba90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
baa0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
bab0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
bac0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
bad0: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
bae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
baf0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
bb00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
bb10: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
bb20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
bb30: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
bb40: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
bb50: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
bb60: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
bb70: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
bb80: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
bb90: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
bba0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
bbb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bbc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
bbd0: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
bbe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
bbf0: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
bc00: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
bc10: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
bc20: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
bc30: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
bc40: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
bc50: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
bc60: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
bc70: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
bc80: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
bc90: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
bca0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
bcb0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
bcc0: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
bcd0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
bce0: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
bcf0: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
bd00: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
bd10: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
bd20: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
bd30: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
bd40: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
bd50: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
bd60: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
bd70: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
bd80: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
bd90: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
bda0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
bdb0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
bdc0: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
bdd0: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
bde0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
bdf0: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
be00: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
be10: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
be20: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
be30: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
be40: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
be50: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
be60: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
be70: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
be80: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
be90: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
bea0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
beb0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
bec0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
bed0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bee0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
bef0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
bf00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
bf10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
bf20: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
bf30: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
bf40: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
bf50: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
bf60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bf70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
bf80: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
bf90: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
bfa0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
bfb0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
bfc0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
bfd0: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
bfe0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
bff0: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
c000: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
c010: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
c020: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
c030: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
c040: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
c050: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
c060: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
c070: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
c080: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
c090: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
c0a0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
c0b0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
c0c0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
c0d0: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
c0e0: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
c0f0: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
c100: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
c110: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
c120: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
c130: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c140: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
c150: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
c160: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
c170: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
c180: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
c190: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
c1a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c1b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c1c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
c1d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
c1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c1f0: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
c200: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
c210: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
c220: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
c230: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c240: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c250: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c260: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
c270: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
c280: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
c290: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
c2a0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
c2b0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
c2c0: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
c2d0: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
c2e0: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
c2f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
c300: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
c310: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
c320: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c330: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
c340: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c350: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
c360: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
c370: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c380: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
c390: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
c3a0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
c3b0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
c3c0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
c3d0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c3e0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c3f0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
c400: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
c410: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
c420: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c430: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
c440: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
c450: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
c460: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
c470: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
c480: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
c490: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
c4a0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
c4b0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
c4c0: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
c4d0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
c4e0: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
c4f0: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
c500: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
c510: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
c520: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
c530: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
c540: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
c550: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
c560: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
c570: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
c580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
c590: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
c5a0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
c5b0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
c5c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
c5d0: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
c5e0: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
c5f0: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
c600: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
c610: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
c620: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
c630: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
c640: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
c650: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
c660: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
c670: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
c680: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
c690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c6a0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
c6b0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
c6c0: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
c6d0: 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
c6e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
c6f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
c700: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
c710: 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
c720: 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
c730: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c740: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c750: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c760: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
c770: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c780: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c790: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
c7a0: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
c7b0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
c7c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c7d0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c7e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
c7f0: 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
c800: 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
c810: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
c820: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
c830: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
c840: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
c850: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
c860: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
c870: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
c880: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
c890: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
c8a0: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
c8b0: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
c8c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
c8d0: 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
c8e0: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
c8f0: 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
c900: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
c910: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
c920: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
c930: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
c940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
c950: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
c960: 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
c970: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c980: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
c9a0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
c9b0: 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
c9c0: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
c9d0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
c9e0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
c9f0: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
ca00: 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71  geSize;.}.int sq
ca10: 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
ca20: 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
ca30: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
ca40: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
ca50: 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
ca60: 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
ca70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
ca80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
ca90: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
caa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
cab0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
cac0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
cad0: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
cae0: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
caf0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
cb00: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
cb10: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
cb20: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
cb30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
cb40: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
cb50: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
cb60: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
cb70: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
cb80: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
cb90: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
cba0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
cbb0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
cbc0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
cbd0: 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
cbe0: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
cbf0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
cc00: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
cc10: 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66  turn n;.}.#endif
cc20: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
cc30: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
cc40: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
cc50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cc60: 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
cc70: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
cc80: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
cc90: 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
cca0: 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
ccb0: 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
ccc0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
ccd0: 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
cce0: 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
ccf0: 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
cd00: 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
cd10: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
cd20: 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
cd30: 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
cd40: 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
cd50: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
cd60: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
cd70: 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
cd80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
cd90: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
cda0: 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
cdb0: 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
cdc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
cdd0: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
cde0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
cdf0: 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
ce00: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
ce10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ce20: 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 61 75  OK;.  u8 av = au
ce30: 74 6f 56 61 63 75 75 6d 20 3f 31 3a 30 3b 0a 0a  toVacuum ?1:0;..
ce40: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ce50: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
ce60: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
ce70: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
ce80: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
ce90: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
cea0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
ceb0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
cec0: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
ced0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
cee0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
cef0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cf00: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
cf10: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
cf20: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
cf30: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
cf40: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
cf50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
cf60: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
cf70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
cf80: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
cf90: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
cfa0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cfb0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
cfc0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
cfd0: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
cfe0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
cff0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
d000: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
d010: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
d020: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
d030: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
d040: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
d050: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
d060: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
d070: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
d080: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
d090: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
d0a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
d0b0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
d0c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
d0d0: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
d0e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
d0f0: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
d100: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
d110: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
d120: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
d130: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
d140: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
d150: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
d160: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
d170: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
d180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d190: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
d1a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
d1b0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d1c0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
d1d0: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
d1e0: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
d1f0: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
d200: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
d210: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
d220: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
d230: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
d240: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
d250: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
d260: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d270: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d280: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
d290: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
d2a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d2b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
d2c0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
d2d0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
d2e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d2f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d300: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
d310: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
d320: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
d330: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
d340: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
d350: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d360: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
d370: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
d380: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
d390: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
d3a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d3b0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d3c0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
d3d0: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
d3e0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
d3f0: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
d400: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
d410: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
d420: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
d430: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
d440: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
d450: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
d460: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
d470: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d480: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d490: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
d4a0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
d4b0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
d4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d4d0: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
d4e0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
d4f0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
d500: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
d510: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
d520: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
d530: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
d540: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
d550: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
d560: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
d570: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
d580: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
d590: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
d5a0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
d5b0: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
d5c0: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
d5d0: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
d5e0: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
d5f0: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
d600: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
d610: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
d620: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
d630: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
d640: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
d650: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d660: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d670: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
d680: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
d690: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
d6a0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
d6b0: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
d6c0: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
d6d0: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
d6e0: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
d6f0: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
d700: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
d710: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
d720: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d730: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d740: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
d750: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
d760: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d770: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
d780: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
d790: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
d7a0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
d7b0: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
d7c0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d7d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
d7e0: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
d7f0: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
d800: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
d810: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
d820: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
d830: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
d840: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
d850: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
d860: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
d870: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
d880: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
d890: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d8a0: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
d8b0: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
d8c0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
d8d0: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
d8e0: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
d8f0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
d900: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d910: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
d920: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
d930: 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
d940: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
d950: 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
d960: 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
d970: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
d980: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
d990: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
d9a0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
d9b0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
d9c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d9d0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
d9e0: 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20   usableSize<500 
d9f0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
da00: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
da10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
da20: 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
da30: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
da40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
da50: 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
da60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
da70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
da80: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
da90: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
daa0: 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
dab0: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
dac0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
dad0: 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
dae0: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
daf0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
db00: 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
db10: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
db20: 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
db30: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
db40: 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
db50: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
db60: 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
db70: 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
db80: 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
db90: 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
dba0: 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
dbb0: 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
dbc0: 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
dbd0: 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
dbe0: 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
dbf0: 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
dc00: 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
dc10: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
dc20: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
dc30: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
dc40: 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
dc50: 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
dc60: 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
dc70: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
dc80: 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
dc90: 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
dca0: 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
dcb0: 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
dcc0: 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
dcd0: 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
dce0: 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
dcf0: 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
dd00: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
dd10: 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
dd20: 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
dd30: 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
dd40: 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
dd50: 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
dd60: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
dd70: 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
dd80: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
dd90: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
dda0: 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
ddb0: 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
ddc0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
ddd0: 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
dde0: 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
ddf0: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
de00: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
de10: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
de20: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
de30: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
de40: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
de50: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
de60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
de70: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
de80: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
de90: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
dea0: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
deb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
dec0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
ded0: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
dee0: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
def0: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
df00: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
df10: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
df20: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
df30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
df40: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
df50: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
df60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
df70: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
df80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
df90: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
dfa0: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
dfb0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
dfc0: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
dfd0: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
dfe0: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
dff0: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
e000: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
e010: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
e020: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
e030: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
e040: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
e050: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
e060: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
e070: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
e080: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
e090: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e0a0: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
e0b0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
e0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
e0d0: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
e0e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e0f0: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
e100: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
e110: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
e120: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
e130: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
e140: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
e150: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
e160: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
e170: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
e180: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
e190: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
e1a0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
e1b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e1c0: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
e1d0: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
e1e0: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
e1f0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
e200: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
e210: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
e220: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
e230: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
e240: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
e250: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
e260: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
e270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
e280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e290: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
e2a0: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
e2b0: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
e2c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e2d0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
e2e0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
e2f0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
e300: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
e310: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
e320: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
e330: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
e340: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
e350: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
e360: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
e370: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
e380: 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66  ;.#if 0.      if
e390: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
e3a0: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
e3b0: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
e3c0: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
e3d0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
e3e0: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
e3f0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
e400: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
e410: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20       pPage->pBt 
e420: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
e430: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  Page->pgno = 1;.
e440: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
e450: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
e460: 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
e470: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50     }.    pBt->pP
e480: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
e490: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
e4a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
e4b0: 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
e4c0: 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
e4d0: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
e4e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
e4f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
e500: 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
e510: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
e520: 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
e530: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e540: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
e550: 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
e560: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e570: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
e580: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
e590: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
e5a0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
e5b0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
e5c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
e5d0: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
e5e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
e5f0: 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
e600: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
e610: 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
e620: 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
e630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
e640: 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
e650: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
e660: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
e670: 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
e680: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
e690: 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
e6a0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
e6b0: 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
e6c0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
e6d0: 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
e6e0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
e6f0: 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
e700: 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
e710: 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
e720: 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
e730: 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
e740: 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
e750: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
e760: 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
e770: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
e780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
e790: 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
e7a0: 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
e7b0: 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
e7c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e7d0: 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
e7e0: 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
e7f0: 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
e800: 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
e810: 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
e820: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
e830: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e840: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e850: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
e860: 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
e870: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
e880: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e890: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
e8a0: 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
e8b0: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
e8c0: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
e8d0: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
e8e0: 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
e8f0: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
e900: 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
e910: 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
e920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
e940: 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
e950: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
e960: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e970: 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
e980: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
e990: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
e9a0: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
e9b0: 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
e9c0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
e9d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e9e0: 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
e9f0: 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
ea00: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
ea10: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
ea20: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
ea30: 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
ea40: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
ea50: 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
ea60: 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
ea70: 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
ea80: 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
ea90: 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
eaa0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
eab0: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
eac0: 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
ead0: 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
eae0: 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
eaf0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
eb00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
eb10: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
eb20: 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
eb30: 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
eb40: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
eb50: 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
eb60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
eb70: 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
eb80: 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
eb90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
eba0: 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
ebb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
ebc0: 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
ebd0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ebe0: 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
ebf0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
ec00: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
ec10: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ec20: 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
ec30: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ec40: 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
ec50: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ec60: 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
ec70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
ec80: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
ec90: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
eca0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
ecb0: 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
ecc0: 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
ecd0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
ece0: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
ecf0: 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
ed00: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
ed10: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
ed20: 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
ed30: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
ed40: 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
ed50: 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
ed60: 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
ed70: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
ed80: 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
ed90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
eda0: 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
edb0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
edc0: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
edd0: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
ede0: 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
edf0: 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
ee00: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
ee10: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
ee20: 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
ee30: 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
ee40: 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
ee50: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
ee60: 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
ee70: 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
ee80: 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
ee90: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
eea0: 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
eeb0: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
eec0: 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
eed0: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
eee0: 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
eef0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
ef00: 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
ef10: 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
ef20: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
ef30: 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
ef40: 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
ef50: 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
ef60: 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
ef70: 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
ef80: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
ef90: 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
efa0: 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
efb0: 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
efc0: 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
efd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
efe0: 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
eff0: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
f000: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f010: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
f020: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
f030: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
f040: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
f050: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72  b = p->db;.  btr
f060: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
f070: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
f080: 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
f090: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
f0a0: 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
f0b0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
f0c0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
f0d0: 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
f0e0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
f0f0: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
f100: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
f110: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
f120: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
f130: 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
f140: 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
f150: 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
f160: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
f170: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
f180: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
f190: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
f1a0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
f1b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
f1c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
f1d0: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
f1e0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
f1f0: 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
f200: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
f210: 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
f220: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
f230: 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
f240: 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
f250: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
f260: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
f270: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
f280: 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
f290: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
f2a0: 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
f2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
f2c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
f2d0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
f2e0: 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77  TRANS_WRITE && w
f2f0: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
f300: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
f310: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
f320: 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
f330: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f340: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
f350: 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
f360: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
f370: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
f380: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
f390: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
f3a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
f3b0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f3d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f3e0: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
f3f0: 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a  _begun;.      }.
f400: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f410: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
f420: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
f430: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
f440: 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
f450: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
f460: 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
f470: 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
f480: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
f490: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f4a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
f4b0: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
f4c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
f4d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f4e0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f4f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f500: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f510: 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
f520: 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20  Page1->pDbPage, 
f530: 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20  wrflag>1);.     
f540: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f550: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f560: 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
f570: 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
f580: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f590: 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
f5a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f5b0: 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20     if( wrflag ) 
f5c0: 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
f5d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f5e0: 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
f5f0: 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
f600: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
f610: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
f620: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f630: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
f640: 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
f650: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
f660: 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
f670: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f680: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
f690: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
f6a0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
f6b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20  Transaction++;. 
f6c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
f6d0: 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
f6e0: 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
f6f0: 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
f700: 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
f710: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
f720: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
f730: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
f740: 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66  Trans;.    }.#if
f750: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f760: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f770: 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
f780: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
f790: 21 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65  !pBt->pExclusive
f7a0: 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
f7b0: 45 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20  Exclusive = p;. 
f7c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f7d0: 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
f7e0: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
f7f0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
f800: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f810: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
f820: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f830: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
f840: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
f850: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
f860: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
f870: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
f880: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
f890: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
f8a0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
f8b0: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
f8c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
f8d0: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
f8e0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
f8f0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
f900: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
f910: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
f920: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
f930: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
f960: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
f970: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
f980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f990: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
f9a0: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
f9b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f9e0: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
f9f0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
fa00: 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
fa10: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
fa20: 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
fa30: 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
fa40: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
fa50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fa60: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fa70: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
fa80: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
fa90: 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
faa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fab0: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
fac0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
fad0: 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
fae0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
faf0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
fb00: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
fb10: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
fb20: 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
fb30: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
fb40: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
fb50: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ll);.    if( rc!
fb60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fb70: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
fb80: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
fb90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
fba0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
fbb0: 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
fbc0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
fbd0: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
fbe0: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
fbf0: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
fc00: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
fc10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fc20: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
fc30: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
fc40: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
fc50: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
fc60: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
fc70: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
fc80: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
fc90: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
fca0: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
fcb0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
fcc0: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
fcd0: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
fce0: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
fcf0: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
fd00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fd10: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
fd20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fd30: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
fd40: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
fd50: 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
fd60: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
fd70: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
fd80: 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
fd90: 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
fda0: 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
fdb0: 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
fdc0: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
fdd0: 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
fde0: 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
fdf0: 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
fe00: 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
fe10: 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
fe20: 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
fe30: 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
fe40: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
fe50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
fe60: 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
fe70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fe80: 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
fe90: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
fea0: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
feb0: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
fec0: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
fed0: 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
fee0: 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
fef0: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
ff00: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
ff10: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
ff20: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
ff30: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
ff40: 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
ff50: 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
ff60: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
ff70: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ff90: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
ffa0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
ffb0: 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
ffc0: 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
ffd0: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
ffe0: 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
fff0: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
10000 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10010 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
10020 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10030 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10040 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
10050 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10060 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
10070 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
10080 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
10090 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
100a0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
100b0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
100c0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
100d0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
100e0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
100f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10120 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
10130 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
10140 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10150 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
10160 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
10170 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
10180 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71  t nCell;..    sq
10190 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
101a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e  ge(pPage);.    n
101b0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
101c0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
101d0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
101e0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
101f0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
10200 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
10210 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
10220 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
10230 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
10240 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  fo;.        sqli
10250 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
10260 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
10270 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
10280 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
10290 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
102a0 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
102b0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
102c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
102d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
102e0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
102f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
10300 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
10310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10320 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
10330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10340 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
10350 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
10360 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
10370 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
10380 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
103a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
103b0 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
103c0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
103d0 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
103e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
103f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
10400 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
10410 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
10420 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10430 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10440 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
10450 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
10460 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
10470 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
10480 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
10490 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
104a0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
104b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
104c0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
104d0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
104e0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
104f0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
10500 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
10510 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
10520 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
10530 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
10540 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
10550 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
10560 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
10570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
10580 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
10590 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
105a0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
105b0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
105c0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
105d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
105e0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
105f0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
10600 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
10610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10620 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
10630 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
10640 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
10650 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
10660 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
10670 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
10680 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
10690 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65  isCommit.){.  Me
106a0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
106b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
106c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
106d0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
106e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
106f0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
10700 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
10710 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
10720 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
10730 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
10740 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
10750 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
10760 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
10770 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
10780 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
10790 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
107a0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
107b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
107c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
107d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
107e0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
107f0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
10800 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
10810 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
10820 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
10830 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
10840 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
10850 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
10860 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
10870 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
10880 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
10890 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
108a0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
108b0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
108c0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
108d0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
108e0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
108f0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
10900 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
10910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10920 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10930 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
10940 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
10950 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
10960 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
10970 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
10980 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
10990 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
109a0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
109b0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
109c0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
109d0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
109e0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
109f0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
10a00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
10a10 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
10a20 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
10a30 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
10a40 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
10a50 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
10a60 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
10a70 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
10a80 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
10a90 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
10aa0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
10ab0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
10ac0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
10ad0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
10ae0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
10af0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
10b00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
10b10 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
10b20 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
10b30 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
10b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10b50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10b60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
10b70 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
10b80 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
10b90 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
10ba0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
10bb0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
10bc0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
10bd0 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
10be0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
10bf0 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20   iFreePage);.   
10c00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10c20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10c30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10c40 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
10c50 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
10c60 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
10c70 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
10c80 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
10c90 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
10ca0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
10cb0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
10cc0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
10cd0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
10ce0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
10cf0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
10d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10d10 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
10d20 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
10d30 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
10d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10d60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10d70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10d80 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
10d90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
10da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10db0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
10dc0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
10dd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
10df0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
10e00 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
10e10 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
10e20 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
10e30 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
10e40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
10e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10e60 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
10e70 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
10e80 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
10e90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
10ea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10eb0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
10ec0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
10ed0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
10ee0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
10ef0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
10f00 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
10f10 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
10f20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
10f30 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
10f40 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
10f50 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
10f60 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
10f70 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51  ul,.** return SQ
10f80 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
10f90 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
10fa0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
10fb0 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e  e no.** point in
10fc0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
10fd0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
10fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10ff0 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  E..**.** More sp
11000 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66  ecificly, this f
11010 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
11020 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
11030 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
11040 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73   so that the las
11050 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
11060 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
11070 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  use.** is no lon
11080 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
11090 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61  * If the nFin pa
110a0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
110b0 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  ero, the impleme
110c0 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a  ntation assumes.
110d0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ** that the call
110e0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
110f0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
11100 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69  tep() until.** i
11110 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
11120 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f  _DONE or an erro
11130 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e  r, and that nFin
11140 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   is the.** numbe
11150 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64  r of pages the d
11160 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
11170 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20  l contain after 
11180 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73  this .** process
11190 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f   is complete..*/
111a0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
111b0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
111c0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
111d0 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61  Fin){.  Pgno iLa
111e0 73 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  stPg;           
111f0 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69    /* Last page i
11200 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
11210 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  /.  Pgno nFreeLi
11220 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
11230 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
11240 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
11250 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
11260 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11270 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11280 74 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50  tex) );.  iLastP
11290 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  g = pBt->nTrunc;
112a0 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d  .  if( iLastPg==
112b0 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67  0 ){.    iLastPg
112c0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
112d0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  t(pBt);.  }..  i
112e0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
112f0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
11300 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
11310 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
11320 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
11330 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
11340 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
11350 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
11360 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
11370 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
11380 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
11390 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e  FreeList==0 || n
113a0 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a  Fin==iLastPg ){.
113b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
113c0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
113d0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
113e0 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
113f0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
11400 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11420 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11430 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
11440 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
11450 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
11460 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11470 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
11480 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
11490 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
114a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69  ){.      if( nFi
114b0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
114c0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
114d0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
114e0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
114f0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
11500 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
11510 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nFin is non-zero
11520 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
11530 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
11540 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
11550 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
11560 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
11570 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
11580 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
11590 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
115a0 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
115b0 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
115c0 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
115d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
115e0 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
115f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
11600 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
11610 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
11620 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
11630 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
11640 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20  LastPg, 1);.    
11650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11690 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
116a0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
116b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
116c0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
116d0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
116e0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
116f0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
11700 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
11710 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
11720 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
11730 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
11740 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  g;..      rc = s
11750 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
11760 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
11770 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
11780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
117a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
117b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
117c0 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
117d0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
117e0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
117f0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
11800 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
11810 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
11820 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
11830 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
11840 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
11850 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
11860 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
11870 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11880 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
11890 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
118a0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
118b0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
118c0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
118d0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
118e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
118f0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
11900 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
11910 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
11920 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
11930 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
11940 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
11950 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
11960 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11980 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
11990 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
119a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
119b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
119c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
119d0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
119e0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
119f0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
11a00 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
11a10 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
11a20 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
11a30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11a40 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
11a50 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
11a60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11a80 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
11a90 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
11aa0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
11ab0 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
11ac0 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
11ad0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11ae0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
11af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11b00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
11b10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
11b20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74      }.  }..  pBt
11b30 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74  ->nTrunc = iLast
11b40 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  Pg - 1;.  while(
11b50 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45   pBt->nTrunc==PE
11b60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11b70 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
11b80 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54  AGE(pBt, pBt->nT
11b90 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74  runc) ){.    pBt
11ba0 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a  ->nTrunc--;.  }.
11bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11bc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
11bd0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11be0 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
11bf0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
11c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11c10 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
11c20 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
11c30 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
11c40 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
11c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11c60 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
11c70 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
11c80 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
11c90 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
11ca0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
11cb0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
11cc0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
11cd0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
11ce0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
11cf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
11d00 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
11d10 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
11d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11d30 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
11d40 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
11d50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11d60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
11d70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11d80 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
11d90 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
11da0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
11db0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
11dc0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
11dd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
11de0 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
11df0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
11e00 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
11e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
11e20 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
11e30 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
11e40 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
11e50 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20  mStep(pBt, 0);. 
11e60 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
11e70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11e80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11e90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11ea0 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
11eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
11ec0 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
11ed0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
11ee0 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
11ef0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
11f00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
11f10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11f20 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
11f30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
11f40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
11f50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
11f60 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
11f70 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
11f80 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
11f90 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
11fa0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
11fb0 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
11fc0 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
11fd0 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
11fe0 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
11ff0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
12000 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
12010 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
12020 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e  Bt, Pgno *pnTrun
12030 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
12040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
12050 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
12060 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
12070 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
12080 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
12090 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
120a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
120b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
120c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
120d0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
120e0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
120f0 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
12100 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
12110 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
12120 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
12130 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  in = 0;..    if(
12140 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20   pBt->nTrunc==0 
12150 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46  ){.      Pgno nF
12160 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ree;.      Pgno 
12170 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63  nPtrmap;.      c
12180 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
12190 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  pBt->pageSize;. 
121a0 20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20       Pgno nOrig 
121b0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
121c0 28 70 42 74 29 3b 0a 0a 20 20 20 20 20 20 69 66  (pBt);..      if
121d0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
121e0 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20  pBt, nOrig) ){. 
121f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12200 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12210 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
12220 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44   if( nOrig==PEND
12230 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
12240 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  t) ){.        nO
12250 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  rig--;.      }. 
12260 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74       nFree = get
12270 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12280 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
12290 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20        nPtrmap = 
122a0 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
122b0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
122c0 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28  nOrig)+pgsz/5)/(
122d0 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e  pgsz/5);.      n
122e0 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
122f0 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
12300 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50       if( nOrig>P
12310 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
12320 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50  (pBt) && nFin<=P
12330 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
12340 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
12350 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
12360 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54  .      while( PT
12370 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
12380 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
12390 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
123a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
123b0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
123c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  }.    }..    whi
123d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
123e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
123f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
12400 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d  Bt, nFin);.    }
12410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12420 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
12430 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30    assert(nFin==0
12440 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d   || pBt->nTrunc=
12450 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d  =0 || nFin<=pBt-
12460 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20  >nTrunc);.      
12470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12480 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
12490 54 72 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b  Trunc && nFin ){
124a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
124b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
124c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
124d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
124e0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
124f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
12500 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
12510 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12520 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
12530 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
12540 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20  nTrunc = nFin;. 
12550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
12580 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
12590 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
125a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
125b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
125c0 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e  *pnTrunc = pBt->
125d0 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d  nTrunc;.    pBt-
125e0 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >nTrunc = 0;.  }
125f0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
12600 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
12610 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
12620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12630 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
12640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12650 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
12660 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12670 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
12680 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
12690 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
126a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
126b0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
126c0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
126d0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
126e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
126f0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
12700 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
12710 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
12720 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
12730 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
12740 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
12750 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
12760 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12770 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
12780 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
12790 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
127a0 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
127b0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
127c0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
127d0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
127e0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
127f0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
12800 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
12810 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
12820 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
12830 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
12840 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
12850 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
12860 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
12870 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12880 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
12890 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
128a0 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
128b0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
128c0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
128d0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
128e0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
128f0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
12900 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
12910 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
12920 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
12930 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
12940 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
12950 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
12960 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
12970 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
12980 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
12990 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
129a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
129b0 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
129c0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
129d0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
129e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
129f0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
12a00 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12a10 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
12a20 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
12a30 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
12a40 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
12a50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12a60 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
12a70 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12a80 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
12a90 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12aa0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12ab0 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
12ac0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
12ad0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
12ae0 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
12af0 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
12b00 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12b10 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
12b20 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
12b30 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
12b40 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
12b50 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
12b60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12b70 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
12b80 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
12b90 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12ba0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
12bb0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12bc0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12be0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12c00 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12c10 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12c20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12c30 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
12c40 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
12c50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12c60 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
12c70 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66  >db = p->db;.#if
12c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12c90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
12ca0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
12cb0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
12cc0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
12cd0 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
12ce0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
12cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12d10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12d20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
12d40 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
12d50 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
12d60 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
12d70 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
12d80 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  runc, 0);.    sq
12d90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12da0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
12db0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
12dc0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
12dd0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
12de0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
12df0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12e00 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
12e10 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
12e20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
12e30 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
12e40 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
12e50 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
12e60 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
12e70 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
12e80 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12e90 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
12ea0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
12eb0 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
12ec0 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
12ed0 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
12ee0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
12ef0 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
12f00 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
12f10 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
12f20 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
12f30 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
12f40 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
12f50 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
12f60 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
12f70 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
12f80 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
12f90 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
12fa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
12fb0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
12fc0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
12fd0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
12fe0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
12ff0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13000 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
13010 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
13020 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
13030 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
13040 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
13050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
13060 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
13070 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
13080 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13090 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
130a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
130b0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
130c0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
130d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
130e0 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
130f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
13100 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
13110 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
13120 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13130 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
13140 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
13150 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
13160 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13170 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
13180 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
13190 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
131a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
131b0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
131c0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
131d0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
131e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
131f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
13200 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
13210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
13230 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13250 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
13260 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13270 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
13280 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
13290 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
132a0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
132b0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
132c0 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
132d0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
132e0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
132f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
13300 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
13310 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
13320 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13330 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
13340 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
13350 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
13360 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
13370 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
13380 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
13390 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
133a0 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
133b0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
133c0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
133d0 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
133e0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
133f0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
13400 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
13410 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13420 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
13430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13440 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
13450 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
13460 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
13470 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
13480 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
13490 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
134a0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
134b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
134c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
134d0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
134e0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
134f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
13500 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
13510 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
13520 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13530 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
13540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13550 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
13560 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
13570 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13580 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
13590 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
135a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
135b0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
135c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
135d0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
135e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
135f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
13600 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13610 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
13620 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13630 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13640 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
13650 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
13660 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
13670 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
13680 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
13690 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
136a0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
136b0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
136c0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
136d0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
136e0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
136f0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
13700 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
13710 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
13720 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
13730 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
13740 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
13750 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
13760 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
13770 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
13780 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
13790 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
137a0 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
137b0 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
137c0 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
137d0 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
137e0 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
137f0 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
13800 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
13810 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
13820 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
13830 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
13840 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
13850 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
13860 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
13870 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
13880 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
13890 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
138a0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
138b0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
138c0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
138d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
138e0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
138f0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
13900 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
13910 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
13920 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
13930 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
13940 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
13950 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
13960 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
13970 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
13980 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
13990 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
139a0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
139b0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
139c0 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
139d0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
139e0 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
139f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13a00 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
13a10 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13a20 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
13a30 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
13a40 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
13a50 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
13a60 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
13a70 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
13a80 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
13a90 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
13aa0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13ab0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
13ac0 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
13ad0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
13ae0 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
13af0 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
13b00 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
13b10 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
13b20 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
13b30 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
13b40 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
13b50 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
13b60 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
13b70 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
13b80 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
13b90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
13ba0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
13bb0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
13bc0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
13bd0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
13be0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13bf0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
13c00 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
13c10 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
13c20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
13c30 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
13c40 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
13c50 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
13c60 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
13c70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
13c80 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
13c90 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
13ca0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
13cb0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
13cc0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
13cd0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
13ce0 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
13cf0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
13d00 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
13d10 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
13d20 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
13d30 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
13d40 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
13d50 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
13d60 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
13d70 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
13d80 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
13d90 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
13da0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
13db0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13dc0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
13dd0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
13de0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
13df0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
13e00 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
13e10 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
13e20 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
13e30 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
13e40 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13e50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
13e60 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
13e70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13e80 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13e90 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
13ea0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
13eb0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
13ec0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13ed0 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
13ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
13ef0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
13f00 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
13f10 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
13f20 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  ) error occured 
13f30 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
13f40 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
13f50 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
13f60 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
13f70 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
13f80 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
13f90 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
13fa0 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
13fb0 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
13fc0 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
13fd0 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
13fe0 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
13ff0 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
14000 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
14010 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
14020 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
14030 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14040 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
14050 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
14060 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
14070 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
14080 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
14090 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
140a0 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
140b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
140c0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
140d0 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
140e0 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
140f0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
14100 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
14110 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
14120 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
14130 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
14140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14150 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14160 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
14170 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
14180 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
14190 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
141a0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
141b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
141c0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
141d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
141e0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
141f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
14200 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
14210 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
14220 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
14230 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
14240 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
14250 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
14260 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
14270 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
14280 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
14290 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
142a0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
142b0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
142c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
142d0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
142e0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
142f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
14300 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14310 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14320 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
14330 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
14340 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
14350 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
14360 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
14370 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
14380 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
14390 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
143a0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
143b0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
143c0 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
143d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
143e0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
143f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
14400 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
14410 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
14420 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
14430 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
14440 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
14450 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
14460 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
14470 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
14480 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
144a0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
144b0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
144c0 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74  ction.  The subt
144d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a  ransaction can.*
144e0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
144f0 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
14500 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
14510 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59  ransaction..** Y
14520 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
14530 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
14540 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
14550 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  btransaction..**
14560 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
14570 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
14580 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68  omatically if th
14590 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
145a0 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72  on.** commits or
145b0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
145c0 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74  ** Only one subt
145d0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
145e0 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69  e active at a ti
145f0 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  me.  It is an er
14600 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f  ror to try.** to
14610 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62   start a new sub
14620 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61  transaction if a
14630 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61  nother subtransa
14640 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
14650 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53   active..**.** S
14660 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
14670 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
14680 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
14690 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
146a0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
146b0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
146c0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
146d0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
146e0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
146f0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
14700 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
14710 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
14720 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
14730 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
14740 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
14750 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
14760 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
14770 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
14780 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
14790 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
147a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
147b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
147c0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
147d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
147e0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
147f0 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e    if( (p->inTran
14800 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  s!=TRANS_WRITE) 
14810 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29  || pBt->inStmt )
14820 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
14830 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
14840 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
14850 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
14860 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14870 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14880 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
14890 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  );.    rc = pBt-
148a0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
148b0 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50  TE_OK : sqlite3P
148c0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42  agerStmtBegin(pB
148d0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
148e0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
148f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
14900 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
14920 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
14930 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
14940 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
14950 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
14960 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
14970 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14980 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
14990 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
149a0 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
149b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
149c0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
149d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
149e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
149f0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
14a00 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
14a10 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
14a20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
14a30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14a40 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
14a50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
14a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
14a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14a80 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
14a90 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
14aa0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14ab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14ac0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
14ad0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
14ae0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
14af0 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
14b00 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
14b10 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
14b20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14b30 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
14b40 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
14b50 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
14b60 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
14b70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
14b80 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
14b90 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
14ba0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
14bb0 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
14bc0 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
14bd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14be0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
14bf0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
14c00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14c10 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14c20 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
14c30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14c40 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
14c50 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
14c60 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
14c70 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
14c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14c90 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
14ca0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
14cb0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
14cc0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
14cd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14cf0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
14d00 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
14d10 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
14d20 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
14d30 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
14d40 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
14d50 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
14d60 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
14d70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14d80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
14d90 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
14da0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
14db0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
14dc0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
14dd0 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
14de0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
14df0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
14e00 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
14e10 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
14e20 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
14e30 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
14e40 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
14e50 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
14e60 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
14e70 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
14e80 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
14e90 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
14ea0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
14eb0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
14ec0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
14ed0 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
14ee0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14ef0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
14f00 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
14f10 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
14f20 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
14f30 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
14f40 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
14f50 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
14f60 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
14f70 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
14f80 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
14f90 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
14fa0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
14fb0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
14fc0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
14fd0 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
14fe0 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
14ff0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
15000 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15010 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
15020 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
15030 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
15040 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
15050 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
15060 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
15070 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
15080 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
15090 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
150a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
150b0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
150c0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
150d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
150e0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
150f0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
15100 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
15110 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
15120 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
15130 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
15140 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
15150 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20  reeCursorSize() 
15160 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
15170 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .** pointed to b
15180 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e  y pCur have been
15190 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63   zeroed by the c
151a0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
151b0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
151c0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151f0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
15200 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
15230 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
15240 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
15250 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15270 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
15280 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
15290 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
152a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
152b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
152c0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
152d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
152e0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
15310 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
15320 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
15330 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53  gno nPage;.  BtS
15340 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15350 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
15360 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
15370 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
15380 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
15390 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
153a0 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
153b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
153c0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
153d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
153e0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
153f0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
15400 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
15410 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  0, 0) ){.      r
15420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
15430 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
15440 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
15450 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
15460 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
15470 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
15480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
154a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
154b0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
154c0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
154d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
154e0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
154f0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
15500 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
15510 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  le;.  rc = sqlit
15520 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
15530 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69  (pBt->pPager, (i
15540 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20  nt *)&nPage); . 
15550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15560 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15570 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   rc;.  }.  if( i
15580 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67  Table==1 && nPag
15590 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  e==0 ){.    rc =
155a0 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
155b0 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
155c0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
155d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
155e0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
155f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
15600 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
15610 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
15630 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
15640 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
15650 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
15660 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
15670 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
15680 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
15690 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
156a0 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68  riables, link th
156b0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
156c0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20  e BtShared list 
156d0 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28  and set *ppCur (
156e0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  the.  ** output 
156f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
15700 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f   function)..  */
15710 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
15720 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
15730 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
15740 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
15750 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  pBt;.  pCur->wrF
15760 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67  lag = (u8)wrFlag
15770 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
15780 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
15790 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
157a0 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
157b0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
157c0 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
157d0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
157e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
157f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
15800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15810 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
15820 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
15830 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
15840 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
15850 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
15860 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
15870 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
15880 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15890 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
158d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15900 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
15910 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
15920 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15950 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
15960 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
15970 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
15980 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
15990 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
159a0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
159b0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
159c0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
159f0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
15a00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15a10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15a20 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
15a30 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
15a40 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
15a50 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
15a60 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
15a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15a80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15a90 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
15aa0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15ab0 53 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e  Size(){.  return
15ac0 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72   sizeof(BtCursor
15ad0 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  );.}..../*.** Cl
15ae0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
15af0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
15b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15b10 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
15b20 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
15b30 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
15b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15b50 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
15b60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15b70 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
15b80 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
15b90 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
15ba0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15bb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15bc0 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
15bd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15be0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42  (pBtree);.    pB
15bf0 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  t->db = pBtree->
15c00 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  db;.    sqlite3B
15c10 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
15c20 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
15c30 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
15c40 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
15c50 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
15c60 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15c70 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15c80 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15c90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15ca0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
15cb0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
15cc0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
15cd0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
15ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
15cf0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
15d00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
15d10 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
15d20 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
15d30 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15d40 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
15d50 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
15d60 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
15d70 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
15d80 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
15d90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15da0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
15db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
15dd0 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
15de0 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
15df0 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
15e00 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
15e10 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
15e20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
15e30 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
15e40 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  e Btree..*/.void
15e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
15e60 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
15e70 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
15e80 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
15e90 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
15ea0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
15eb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d  tex(pCur) );.  m
15ec0 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
15ed0 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43  pCur, sizeof(BtC
15ee0 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70  ursor));.  pTemp
15ef0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
15f00 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
15f10 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  v = 0;.  for(i=0
15f20 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69  ; i<=pTempCur->i
15f30 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
15f40 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
15f50 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65  pTempCur->apPage
15f60 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
15f70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65   }.  assert( pTe
15f80 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29  mpCur->pKey==0 )
15f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
15fa0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
15fb0 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
15fc0 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
15fd0 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
15fe0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
15ff0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
16000 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
16010 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
16020 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
16030 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16040 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
16050 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f  ex(pCur) );.  fo
16060 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
16070 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
16080 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
16090 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ef(pCur->apPage[
160a0 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
160b0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
160c0 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a  (pCur->pKey);.}.
160d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
160e0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
160f0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
16100 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
16110 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
16120 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
16130 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
16140 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
16150 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
16160 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
16170 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
16180 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
16190 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
161a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
161b0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
161c0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
161d0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
161e0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
161f0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
16200 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
16210 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
16220 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
16230 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
16240 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
16250 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
16260 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
16270 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
16280 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
16290 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
162a0 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
162b0 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
162c0 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
162d0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
162e0 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
162f0 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
16300 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
16310 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
16320 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
16330 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
16340 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
16350 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
16360 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
16370 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
16380 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
16390 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
163a0 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
163b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
163c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
163d0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
163e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
163f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
16400 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
16410 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
16420 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
16430 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
16440 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16450 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
16460 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
16470 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
16480 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
16490 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
164a0 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
164b0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
164c0 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
164d0 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
164e0 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
164f0 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
16500 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
16510 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
16520 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
16530 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
16540 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
16550 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
16560 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
16570 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
16580 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
165a0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
165b0 50 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Page;.      sqli
165c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
165d0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
165e0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
165f0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
16600 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
16610 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
16620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16630 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
16640 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
16650 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
16660 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
16670 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
16680 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
16690 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
166a0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
166b0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
166c0 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
166d0 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
16710 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
16720 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16760 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
16770 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
167b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
167c0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
167d0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
167e0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
167f0 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
16800 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
16810 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
16850 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
168a0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
168b0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
168f0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
16900 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
16910 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
16920 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
16930 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
16940 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
16950 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
16960 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
16970 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
16980 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
16990 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
169a0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
169b0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
169c0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
169d0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
169e0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
169f0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
16a00 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
16a10 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
16a20 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
16a30 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
16a40 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
16a50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
16a60 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
16a70 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
16a80 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
16a90 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
16aa0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
16ab0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
16ac0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
16ae0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
16af0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16b00 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
16b10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
16b20 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
16b30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
16b40 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
16b50 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
16b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
16b70 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
16b80 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
16b90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
16ba0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16bc0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
16bd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16be0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
16bf0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
16c00 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
16c10 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
16c20 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
16c30 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
16c40 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
16c50 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
16c60 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
16c70 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
16c80 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
16c90 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
16ca0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
16cb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
16cc0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
16cd0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
16ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16cf0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
16d00 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
16d10 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
16d20 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
16d30 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
16d40 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
16d50 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
16d60 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
16d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
16d90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16da0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
16db0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16dc0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
16dd0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
16de0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16df0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
16e00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
16e10 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
16e20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
16e30 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
16e40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16e50 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
16e60 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
16e70 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
16e80 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
16e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16ea0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
16eb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16ec0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
16ed0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16ee0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
16ef0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
16f00 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
16f10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
16f20 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
16f30 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
16f40 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
16f50 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
16f60 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
16f70 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
16f80 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
16f90 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
16fa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16fb0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
16fc0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
16fd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
16fe0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16ff0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17000 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
17010 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78   Unless pPgnoNex
17020 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70  t is NULL, the p
17030 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17040 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
17050 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20  .** page in the 
17060 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77  linked list is w
17070 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
17080 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
17090 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  fl.** is the las
170a0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
170b0 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
170c0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
170d0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
170e0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
170f0 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
17100 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
17110 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
17120 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
17130 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
17140 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
17150 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
17160 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
17170 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
17180 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
17190 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
171a0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
171b0 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
171c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
171d0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
171e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
171f0 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
17220 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
17230 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
17240 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
17250 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
17260 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17280 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
17290 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
172a0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
172b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
172c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
172d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
172e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
172f0 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
17300 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
17310 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
17320 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
17330 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
17340 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
17350 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
17360 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
17370 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
17380 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17390 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
173a0 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
173b0 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
173c0 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
173d0 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
173e0 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
173f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
17400 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
17410 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
17420 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
17430 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
17440 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
17450 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17460 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
17470 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
17480 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
17490 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
174a0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
174b0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
174c0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
174d0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
174e0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
174f0 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
17500 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
17510 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
17520 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
17530 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
17540 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
17550 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
17560 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
17570 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
17580 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
17590 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
175a0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
175b0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
175c0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
175d0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
175e0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
175f0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
17600 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
17610 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
17620 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17630 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
17640 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
17650 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
17660 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
17670 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
17680 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
17690 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
176a0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
176b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
176c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
176d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
176e0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
176f0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
17700 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
17710 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
17720 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
17730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
17740 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d  if..  if( next==
17750 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20  0 || ppPage ){. 
17760 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
17770 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  e = 0;..    rc =
17780 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17790 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
177a0 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29  &pPage, next!=0)
177b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d  ;.    assert(rc=
177c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
177d0 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28  age==0);.    if(
177e0 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d   next==0 && rc==
177f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17800 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
17810 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
17820 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17830 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20   ppPage ){.     
17840 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
17850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17860 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17870 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
17880 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
17890 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  next;..  return 
178a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  rc;.}../*.** Cop
178b0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
178c0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
178d0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
178e0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
178f0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
17900 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
17910 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
17920 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
17930 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
17940 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
17950 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
17960 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
17970 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
17980 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
17990 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
179a0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
179b0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
179c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
179d0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
179e0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
179f0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
17a00 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
17a10 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
17a20 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
17a30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
17a40 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
17a50 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
17a60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
17a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
17a80 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
17a90 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
17aa0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17ab0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
17ac0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ae0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
17af0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
17b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17b10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17b20 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
17b30 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
17b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
17b50 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
17b60 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
17b70 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
17b80 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
17b90 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
17ba0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
17bb0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
17bc0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
17bd0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
17be0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
17bf0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17c00 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
17c10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
17c20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
17c30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
17c60 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
17c70 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
17c80 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
17c90 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
17ca0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
17cb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17cc0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
17cd0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
17ce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17d00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d10 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
17d20 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
17d30 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
17d40 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
17d50 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
17d60 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
17d70 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
17d80 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
17d90 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
17da0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
17db0 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
17dc0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17dd0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
17de0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
17df0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
17e00 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
17e10 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
17e20 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
17e30 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
17e40 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
17e50 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
17e60 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
17e70 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
17e80 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
17e90 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
17ea0 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
17eb0 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
17ec0 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
17ed0 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
17ee0 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
17ef0 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
17f00 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
17f10 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
17f20 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
17f30 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
17f40 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
17f50 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
17f60 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
17f70 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
17f80 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
17f90 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
17fa0 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
17fb0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
17fc0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
17fd0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
17fe0 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
17ff0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
18000 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
18010 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
18020 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
18030 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
18040 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
18050 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
18060 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
18070 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
18080 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
18090 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
180a0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
180b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
180c0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
180d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
180e0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
180f0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
18100 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
18110 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
18120 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
18130 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
18140 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
18150 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
18160 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
18170 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
18180 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
18190 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
181a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
181b0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
181c0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
181d0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
181e0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
181f0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
18200 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
18210 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
18220 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
18230 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
18240 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
18250 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
18260 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
18270 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
18280 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
18290 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
182a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
182b0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
182c0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
182d0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
182e0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
182f0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
18300 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
18310 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
18320 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
18330 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
18340 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
18350 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
18360 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
18370 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
18380 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
18390 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
183a0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
183b0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
183c0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
183d0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
183e0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
183f0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
18400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18410 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
18420 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
18430 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
18440 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
18450 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
18460 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
18470 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
18480 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18490 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
184a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
184b0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
184c0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
184d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
184e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
184f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18500 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
18510 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
18520 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
18530 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
18540 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18550 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18560 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
18570 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
18580 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
18590 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
185a0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
185b0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
185c0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
185d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
185e0 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
185f0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
18600 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
18610 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
18620 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
18630 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  ta .   || &aPayl
18640 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
18650 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
18660 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
18670 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
18680 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
18690 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
186a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
186b0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
186c0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
186d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
186e0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
186f0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
18700 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
18710 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
18720 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
18730 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
18740 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18750 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
18760 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
18770 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
18780 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
18790 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
187a0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
187b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
187c0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
187d0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
187e0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
187f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
18800 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
18810 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
18820 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
18830 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
18840 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
18850 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
18860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18870 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
18880 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
18890 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
188a0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
188b0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
188c0 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
188d0 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
188e0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
188f0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
18900 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
18910 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
18920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
18930 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
18940 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
18950 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
18960 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
18970 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
18980 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
18990 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
189a0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
189b0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
189c0 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
189d0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
189e0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
189f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
18a00 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
18a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
18a20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
18a30 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
18a40 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
18a50 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
18a60 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
18a70 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
18a80 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
18a90 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
18aa0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
18ab0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
18ac0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
18ad0 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
18ae0 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
18af0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
18b00 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
18b10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
18b20 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
18b30 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
18b40 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
18b50 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18b60 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
18b70 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
18b80 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
18b90 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
18ba0 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
18bb0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
18bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18bd0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
18be0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18bf0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
18c00 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
18c10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
18c20 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
18c30 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
18c40 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
18c50 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
18c60 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
18c70 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
18c80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
18c90 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
18ca0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
18cb0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
18cc0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
18cd0 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
18ce0 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
18cf0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
18d00 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
18d10 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
18d20 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
18d30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
18d40 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
18d50 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
18d60 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
18d70 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
18d80 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
18d90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
18da0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
18db0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
18dc0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
18dd0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
18de0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
18df0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
18e00 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18e10 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
18e20 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
18e30 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
18e40 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18e50 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
18e60 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
18e70 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
18e80 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
18e90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
18ea0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
18eb0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
18ec0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
18ed0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
18ee0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
18ef0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
18f00 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
18f10 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
18f20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
18f30 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
18f40 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
18f50 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
18f60 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
18f70 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
18f80 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
18f90 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
18fa0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
18fb0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
18fc0 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
18fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
18fe0 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
18ff0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
19000 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
19010 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
19020 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
19030 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
19040 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
19050 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
19060 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
19070 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
19080 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
19090 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
190a0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
190b0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
190c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
190d0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
190e0 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
190f0 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
19100 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
19110 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
19120 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
19130 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
19140 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
19150 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
19160 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
19170 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
19180 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
19190 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
191a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
191b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
191c0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
191d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
191e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
191f0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
19200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
19210 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
19220 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
19230 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
19240 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
19250 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
19260 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
19270 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
19280 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
19290 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
192a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
192b0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
192c0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
192d0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
192e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
192f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
19300 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
19310 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
19320 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
19330 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
19340 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
19350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19360 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
19370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19380 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
19390 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
193a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
193b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
193c0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
193d0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
193e0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
193f0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
19400 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
19410 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
19420 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
19430 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
19440 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
19450 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
19460 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
19470 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
19480 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
19490 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
194a0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
194b0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
194c0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
194d0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
194e0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
194f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19500 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
19510 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
19520 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
19530 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
19540 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
19550 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19560 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
19570 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
19580 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
19590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
195a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
195b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
195c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
195d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
195e0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
195f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19600 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  age] );.    if( 
19610 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
19620 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
19630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19640 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19650 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19660 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
19670 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
19680 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
19690 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
196a0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
196b0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
196c0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
196d0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
196e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
196f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
19700 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
19710 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
19720 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
19730 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
19740 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
19750 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
19760 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
19770 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
19780 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
19790 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
197a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
197b0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
197c0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
197d0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
197e0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
197f0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
19800 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
19810 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
19820 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
19830 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
19840 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
19850 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
19860 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
19870 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
19880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19890 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
198a0 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
198b0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
198c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
198d0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
198e0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
198f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19900 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
19910 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
19920 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
19930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19940 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19950 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19960 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
19970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
19980 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
19990 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
199a0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
199b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
199c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
199d0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
199e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
199f0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
19a00 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
19a10 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
19a20 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
19a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19a40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19a50 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
19a60 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
19a70 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
19a80 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
19a90 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
19aa0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
19ab0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
19ac0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
19ad0 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
19ae0 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
19af0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
19b00 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
19b10 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
19b20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19b30 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
19b40 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
19b50 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
19b60 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
19b70 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
19b80 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
19b90 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
19ba0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
19bb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
19bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
19bd0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
19be0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
19bf0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
19c00 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
19c10 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
19c20 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
19c30 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
19c40 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
19c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
19c60 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
19c70 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
19c80 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
19c90 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
19ca0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
19cb0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
19cc0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
19cd0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
19ce0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
19cf0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
19d00 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mbly.** the key/
19d10 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
19d20 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
19d30 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
19d40 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
19d50 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
19d60 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
19d70 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
19d80 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
19d90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
19da0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
19db0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
19dc0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
19dd0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
19de0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
19df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
19e00 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
19e10 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
19e20 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
19e30 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
19e40 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
19e50 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
19e60 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
19e70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
19e80 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19e90 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
19ea0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
19eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
19ec0 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
19ed0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
19ee0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
19ef0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
19f00 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
19f10 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
19f20 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
19f30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
19f40 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
19f50 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
19f60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
19f70 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
19f80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19f90 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
19fa0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19fb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19fc0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
19fd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19fe0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
19ff0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1a000 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1a010 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1a020 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1a030 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1a040 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1a050 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1a060 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1a070 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1a080 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1a090 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a0a0 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1a0b0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1a0c0 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1a0d0 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1a0e0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1a0f0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1a100 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1a110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1a120 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1a130 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1a140 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1a150 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1a160 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1a170 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1a180 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1a190 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1a1a0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1a1b0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1a1c0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1a1d0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1a1e0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1a1f0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1a200 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1a210 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1a220 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1a230 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1a240 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1a250 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1a260 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1a270 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1a280 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1a290 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1a2a0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1a2b0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1a2c0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1a2d0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1a2e0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1a2f0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1a300 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1a310 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1a320 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1a330 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1a340 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1a350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1a360 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1a370 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1a380 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1a390 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1a3a0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1a3b0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1a3c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1a3d0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1a3e0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1a3f0 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1a400 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1a410 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1a420 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a430 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1a440 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a450 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1a460 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1a470 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1a480 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1a490 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1a4a0 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n 0;.}.const voi
1a4b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1a4c0 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1a4d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1a4e0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
1a4f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1a500 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1a510 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a520 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1a530 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1a540 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1a550 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1a560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1a570 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1a580 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a590 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1a5a0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1a5b0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1a5c0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1a5d0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1a5e0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1a5f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1a600 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1a610 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1a620 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1a630 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1a640 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1a650 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1a660 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a670 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1a680 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a690 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a6a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a6b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a6c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1a6d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1a6e0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1a6f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1a700 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1a710 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1a720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a730 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a740 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1a750 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1a760 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1a770 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1a780 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1a790 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1a7a0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1a7b0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1a7c0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1a7d0 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1a7e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1a7f0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1a800 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1a810 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
1a820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a830 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a840 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1a860 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1a870 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1a880 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1a890 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1a8a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1a8b0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1a8c0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1a8d0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1a8e0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1a8f0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1a900 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1a910 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1a920 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1a930 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1a940 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1a950 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1a960 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1a970 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1a980 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1a990 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1a9a0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1a9b0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1a9c0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1a9d0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1a9e0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1a9f0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1aa00 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1aa10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1aa20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1aa30 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1aa40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1aa50 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1aa60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1aa70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1aa80 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1aa90 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1aaa0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1aab0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1aac0 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1aad0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1aae0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1aaf0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1ab00 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1ab10 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1ab20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1ab30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1ab40 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1ab50 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1ab60 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1ab70 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1ab80 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1ab90 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1aba0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1abb0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1abc0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1abd0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1abe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1abf0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1ac00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ac10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ac20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ac30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ac40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ac50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1ac60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1ac70 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1ac80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ac90 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1aca0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1acb0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1acc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1acd0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1ace0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1acf0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1ad00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ad10 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
1ad20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1ad30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ad40 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
1ad50 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
1ad60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1ad70 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1ad80 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
1ad90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ada0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1adb0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1adc0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1add0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1ade0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1adf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ae00 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1ae10 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1ae20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ae30 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1ae40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ae50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ae60 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1ae70 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1ae80 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1ae90 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1aea0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1aeb0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1aec0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1aed0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1aee0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1aef0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1af00 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1af10 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1af20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1af30 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1af40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1af50 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1af60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1af70 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1af80 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
1af90 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
1afa0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1afb0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
1afc0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1afd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1afe0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1aff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1b000 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1b010 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1b020 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1b030 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1b040 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
1b050 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
1b060 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1b070 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1b080 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1b090 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1b0a0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1b0b0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
1b0c0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1b0d0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1b0e0 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  t );.  pCur->iPa
1b0f0 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ge = 0;.  pCur->
1b100 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
1b110 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b120 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1b130 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1b140 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1b150 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
1b160 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1b170 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1b180 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1b190 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1b1a0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
1b1b0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
1b1c0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
1b1d0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
1b1e0 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
1b1f0 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
1b200 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1b210 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
1b220 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1b230 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
1b240 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
1b250 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1b260 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
1b270 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1b280 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1b290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1b2b0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1b2c0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
1b2d0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1b2e0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
1b2f0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1b300 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1b310 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
1b320 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
1b330 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1b340 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
1b350 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
1b360 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1b370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1b380 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
1b390 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1b3a0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1b3b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b3c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1b3d0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1b3e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b3f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1b400 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1b410 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1b420 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1b430 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1b440 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1b450 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
1b460 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1b470 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1b480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1b490 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b4a0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1b4b0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1b4c0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
1b4d0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
1b4e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1b4f0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1b500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1b520 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1b530 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1b540 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1b550 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1b560 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1b570 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1b580 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1b590 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1b5a0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1b5b0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1b5c0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1b5d0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1b5e0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1b5f0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1b600 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1b610 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1b620 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1b630 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1b640 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1b650 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1b660 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b670 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1b680 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1b690 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1b6a0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1b6b0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1b6c0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1b6d0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1b6e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1b6f0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1b700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b710 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1b720 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1b730 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1b740 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1b750 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1b760 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b770 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1b780 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1b790 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1b7a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1b7b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1b7c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1b7d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1b7e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1b7f0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
1b800 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1b810 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
1b820 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1b830 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1b840 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1b850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b860 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b870 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
1b880 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
1b890 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1b8a0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1b8b0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1b8c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b8d0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1b8e0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
1b8f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1b900 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1b910 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1b920 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1b930 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1b940 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1b950 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1b960 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1b970 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1b980 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1b990 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b9a0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
1b9b0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1b9c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1b9d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b9e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1ba00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ba10 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1ba20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1ba30 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1ba40 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1ba50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1ba60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ba70 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1ba80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ba90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1baa0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1bab0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
1bac0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
1bad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1baf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1bb00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1bb10 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
1bb20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1bb30 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1bb40 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1bb50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bb60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1bb70 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1bb80 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1bb90 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1bba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1bbb0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1bbc0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1bbd0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1bbe0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1bbf0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1bc00 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1bc10 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1bc20 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1bc30 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
1bc40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1bc50 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1bc60 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
1bc70 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1bc80 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1bc90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1bca0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1bcb0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1bcc0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1bcd0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1bce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bcf0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
1bd00 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1bd10 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1bd20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1bd30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1bd40 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1bd50 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1bd60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1bd80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1bd90 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
1bda0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1bdb0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1bdc0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1bdd0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1bde0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
1bdf0 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49  tLast = rc==SQLI
1be00 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20  TE_OK ?1:0;.    
1be10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1be20 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1be30 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1be40 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1be50 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
1be60 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
1be70 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
1be80 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
1be90 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1bea0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1beb0 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
1bec0 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
1bed0 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
1bee0 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
1bef0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1bf00 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
1bf10 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
1bf20 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
1bf30 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
1bf40 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
1bf50 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
1bf60 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
1bf70 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
1bf80 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
1bf90 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
1bfa0 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
1bfb0 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
1bfc0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
1bfd0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
1bfe0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
1bff0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
1c000 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
1c010 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1c020 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1c030 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1c040 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
1c050 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
1c060 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
1c070 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
1c080 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
1c090 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
1c0a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c0b0 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1c0c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1c0d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1c0e0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1c110 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
1c120 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
1c130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c140 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
1c150 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
1c160 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
1c170 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
1c180 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
1c190 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1c1a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1c1b0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
1c1d0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
1c1e0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
1c1f0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
1c200 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1c210 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1c220 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1c230 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
1c240 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
1c250 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
1c260 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1c270 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
1c280 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
1c290 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1c2a0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1c2b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c2c0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
1c2d0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1c2e0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c300 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
1c310 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
1c320 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1c330 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1c340 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1c350 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1c360 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1c370 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1c380 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
1c390 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1c3a0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1c3b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c3c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1c3d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c3e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1c3f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1c400 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1c410 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1c420 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
1c430 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
1c440 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
1c450 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
1c460 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
1c470 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
1c480 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
1c490 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c4a0 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
1c4b0 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
1c4c0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1c4d0 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
1c4e0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1c4f0 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
1c500 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1c510 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c520 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c530 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
1c540 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
1c550 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
1c560 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
1c570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c590 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
1c5a0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1c5b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1c5c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1c5d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1c5e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c5f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1c600 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1c610 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
1c620 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1c630 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1c640 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1c650 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1c660 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1c670 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1c680 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1c690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c6a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1c6b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1c6c0 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
1c6d0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
1c6e0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
1c6f0 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
1c700 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
1c710 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
1c720 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c730 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  e];.    int c = 
1c740 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1c750 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1c760 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1c770 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1c780 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1c790 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1c7a0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1c7b0 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 20  y && pIdxKey==0 
1c7c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c7d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c7e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
1c7f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c800 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1c810 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1c820 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1c830 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70  iPage] = (u16)up
1c840 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1c850 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1c860 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1c870 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32  u16)((upr+lwr)/2
1c880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c890 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28   lwr<=upr ) for(
1c8a0 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  ;;){.      void 
1c8b0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1c8c0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1c8d0 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
1c8e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1c8f0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 70  >iPage];.      p
1c900 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1c910 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  = 0;.      pCur-
1c920 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1c930 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1c940 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1c950 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1c960 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
1c970 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
1c980 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
1c990 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
1c9a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
1c9b0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1c9c0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
1c9d0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
1c9e0 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
1c9f0 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
1ca00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
1ca10 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
1ca20 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
1ca30 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
1ca40 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
1ca50 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1ca60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ca70 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
1ca80 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1ca90 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1caa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cab0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
1cac0 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
1cad0 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1caf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1cb00 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1cb10 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1cb20 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1cb30 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1cb40 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1cb50 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1cb60 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1cb70 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1cb80 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1cb90 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1cba0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1cbb0 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65  Compare((int)nCe
1cbc0 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1cbd0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
1cbe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cbf0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
1cc00 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
1cc10 6e 74 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  nt)nCellKey );. 
1cc20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1cc30 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
1cc40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cc50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1cc60 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
1cc70 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1cc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cc90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1cca0 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
1ccb0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 28 76  int)nCellKey, (v
1ccc0 6f 69 64 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  oid*)pCellKey);.
1ccd0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
1cce0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ccf0 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65 6c  ompare((int)nCel
1cd00 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1cd10 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
1cd20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1cd30 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
1cd40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
1cd50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1cd60 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1cd70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1cd80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1cd90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
1cda0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1cdb0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1cdc0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1cdd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1cde0 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
1cdf0 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1ce00 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1ce10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1ce20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ce30 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1ce40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ce50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ce60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1ce70 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1ce80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ce90 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1cea0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
1ceb0 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
1cec0 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
1ced0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
1cee0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1cef0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  r ){.        pCu
1cf00 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1cf10 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1cf20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1cf30 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1cf40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1cf50 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29   (u16)((lwr+upr)
1cf60 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  /2);.    }.    a
1cf70 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
1cf80 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1cf90 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1cfa0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1cfb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
1cfc0 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
1cfd0 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
1cfe0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1cff0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1d000 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d010 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d020 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
1d030 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
1d040 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
1d050 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
1d060 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1d070 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
1d080 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1d090 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1d0a0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1d0b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1d0c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
1d0d0 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1d0e0 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
1d0f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d100 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1d110 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
1d120 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d130 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1d140 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
1d150 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1d160 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1d170 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
1d180 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1d190 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
1d1a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
1d1b0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
1d1c0 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
1d1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d1e0 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
1d1f0 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
1d200 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
1d210 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
1d220 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
1d230 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
1d240 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1d250 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
1d260 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
1d270 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
1d280 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1d290 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
1d2a0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1d2b0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20  3BtreeMoveto(.  
1d2c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d2d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
1d2e0 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
1d2f0 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
1d300 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1d310 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
1d320 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
1d330 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
1d340 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
1d350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
1d360 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
1d370 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
1d380 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
1d390 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
1d3a0 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
1d3b0 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
1d3c0 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
1d3d0 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
1d3e0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1d3f0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1d400 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d420 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
1d430 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d440 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
1d450 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
1d460 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1d470 52 65 63 6f 72 64 20 61 53 70 61 63 65 5b 31 36  Record aSpace[16
1d480 5d 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65  ]; /* Temp space
1d490 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
1d4a0 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
1d4b0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
1d4c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
1d4d0 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
1d4e0 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
1d4f0 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1d500 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1d510 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
1d520 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20  t)nKey, pKey,.  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65      aSpace, size
1d560 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20  of(aSpace));.   
1d570 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
1d580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d590 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
1d5a0 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
1d5b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1d5c0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1d5d0 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
1d5e0 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
1d5f0 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
1d600 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
1d610 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
1d620 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b  ckedRecord(pIdxK
1d630 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
1d640 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1d650 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1d660 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1d670 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1d680 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1d690 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1d6a0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1d6b0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1d6c0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1d6d0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1d6e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1d6f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1d700 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1d710 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1d720 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1d730 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1d740 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1d750 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1d760 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d770 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1d780 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1d790 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1d7a0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1d7b0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1d7c0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1d7d0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1d7e0 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1d7f0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1d800 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1d810 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1d820 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1d830 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1d840 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1d850 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1d860 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1d870 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1d880 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1d890 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d8a0 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72  handle for a cur
1d8b0 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  sor..*/.sqlite3 
1d8c0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  *sqlite3BtreeCur
1d8d0 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75  sorDb(const BtCu
1d8e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1d8f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d900 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1d910 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1d920 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  x) );.  return p
1d930 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  Cur->pBtree->db;
1d940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
1d950 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1d960 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
1d970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1d980 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1d990 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1d9a0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1d9b0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1d9c0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1d9d0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1d9e0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
1d9f0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
1da00 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
1da10 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
1da20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1da30 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
1da40 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1da50 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1da60 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
1da70 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1da80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1da90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1daa0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1dab0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1dac0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1dad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1daf0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
1db00 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  0 );.  if( CURSO
1db10 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1db20 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1db30 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1db40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1db50 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1db60 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43  skip>0 ){.    pC
1db70 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1db80 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1db90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dba0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1dbb0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
1dbc0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1dbd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1dbe0 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
1dbf0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1dc00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
1dc10 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1dc20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61  assert( idx<=pPa
1dc30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1dc40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1dc50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1dc60 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
1dc70 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
1dc80 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1dc90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dca0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1dcb0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1dcc0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1dcd0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1dce0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1dcf0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1dd00 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1dd10 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1dd20 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1dd30 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1dd40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1dd50 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1dd60 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
1dd70 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
1dd80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
1dd90 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1dda0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1ddb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ddc0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1ddd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1dde0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
1ddf0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
1de00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1de10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1de20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
1de30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1de40 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
1de50 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
1de60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1de70 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1de80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1de90 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
1dea0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1deb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dec0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
1ded0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1dee0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
1def0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1df00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
1df20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1df30 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1df40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
1df50 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
1df60 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
1df70 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
1df80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1df90 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1dfa0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1dfb0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1dfc0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1dfd0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1dfe0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1dff0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1e000 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1e010 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1e020 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1e030 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1e040 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1e050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1e060 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1e070 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
1e080 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1e090 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e0a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1e0b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1e0c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1e0d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1e0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1e0f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
1e100 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
1e110 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1e120 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1e130 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1e140 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1e150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1e160 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30  if( pCur->skip<0
1e170 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1e180 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1e190 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1e1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e1b0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1e1c0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
1e1d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e1e0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1e1f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1e200 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
1e210 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
1e220 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1e230 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e240 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1e250 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1e260 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1e270 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
1e280 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e2a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
1e2b0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1e2c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e2d0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
1e2e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
1e2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1e300 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
1e310 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1e320 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1e330 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1e340 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1e350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e360 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1e370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e380 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
1e390 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  r);.    }.    pC
1e3a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1e3b0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1e3c0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
1e3d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1e3e0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
1e3f0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1e400 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e410 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
1e420 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
1e430 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1e440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e450 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1e460 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1e470 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1e480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e490 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1e4a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1e4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1e4c0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1e4d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1e4e0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1e4f0 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1e500 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1e510 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1e520 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e530 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1e540 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1e550 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1e560 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1e570 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1e580 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1e590 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1e5a0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1e5b0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1e5c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e5d0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1e5e0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1e5f0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1e600 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1e610 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1e620 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1e630 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1e640 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1e650 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1e660 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1e670 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1e680 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1e690 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1e6a0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1e6b0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1e6c0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1e6d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1e6e0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1e6f0 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1e700 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1e710 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1e720 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1e730 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1e740 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1e750 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1e760 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1e770 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1e780 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1e790 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1e7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e7b0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1e7c0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1e7d0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1e7e0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1e7f0 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1e800 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1e810 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1e820 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1e830 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1e840 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1e850 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1e860 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1e870 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1e880 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1e890 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1e8a0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1e8b0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1e8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1e8d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1e8e0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1e8f0 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1e900 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1e910 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1e920 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1e930 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1e940 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1e950 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1e960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e970 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1e980 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1e990 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e9a0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1e9b0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1e9c0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1e9d0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1e9e0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1e9f0 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1ea00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ea10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ea20 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1ea30 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1ea40 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1ea50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1ea60 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1ea70 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1ea80 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1ea90 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1eaa0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1eab0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1eac0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1ead0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1eae0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1eaf0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1eb00 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1eb10 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1eb20 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1eb30 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1eb40 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1eb50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1eb60 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1eb70 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1eb80 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1eb90 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1eba0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1ebb0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1ebc0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1ebd0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1ebe0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1ebf0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ec00 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1ec10 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67  t && nearby<=pag
1ec20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1ec30 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
1ec40 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
1ec50 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
1ec60 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1ec70 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
1ec80 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1ec90 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
1eca0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
1ecb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ecc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
1ecd0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1ece0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1ecf0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1ed00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1ed10 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
1ed20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ed30 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
1ed40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
1ed50 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
1ed60 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
1ed70 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
1ed80 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
1ed90 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
1eda0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
1edb0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
1edc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1edd0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1ede0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1edf0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ee00 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
1ee10 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ee20 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
1ee30 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
1ee40 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
1ee50 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
1ee60 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
1ee70 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
1ee80 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
1ee90 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
1eea0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1eeb0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
1eec0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
1eed0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
1eee0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
1eef0 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
1ef00 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
1ef10 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
1ef20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
1ef30 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1ef40 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1ef50 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1ef60 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
1ef70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ef80 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1ef90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1efa0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
1efb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1efc0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1efd0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
1efe0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  unk, 0);.      i
1eff0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1f000 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1f010 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f020 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f030 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
1f040 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1f050 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1f060 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
1f070 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
1f080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1f090 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
1f0a0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
1f0b0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
1f0c0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
1f0d0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
1f0e0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
1f0f0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
1f100 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
1f110 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
1f120 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1f130 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
1f140 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
1f150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f160 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1f170 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1f180 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f190 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1f1a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1f1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f1c0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
1f1d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f1e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f1f0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1f200 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1f210 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1f220 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
1f230 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1f240 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1f250 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1f260 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1f270 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1f280 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
1f290 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
1f2a0 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
1f2b0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1f2c0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
1f2d0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
1f2e0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
1f2f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f300 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f310 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f320 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f340 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1f360 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
1f370 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
1f380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
1f390 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
1f3a0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
1f3b0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
1f3c0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1f3d0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
1f3e0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
1f3f0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
1f400 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f410 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1f420 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
1f430 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1f440 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1f450 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1f460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1f470 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f480 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1f490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1f4b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f4c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1f4d0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
1f4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1f4f0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1f510 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1f520 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1f530 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1f540 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f550 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1f560 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
1f570 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1f580 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1f590 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f5a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1f5c0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
1f5d0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
1f5e0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
1f5f0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
1f600 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
1f610 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
1f620 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
1f630 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
1f640 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1f650 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
1f660 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f670 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
1f680 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
1f690 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
1f6a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1f6b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
1f6c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f6d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f6e0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
1f6f0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
1f700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
1f730 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f740 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1f750 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1f760 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f770 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
1f780 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f7a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f7b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f7c0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f7d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f7e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f7f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f800 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1f810 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
1f820 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1f830 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1f840 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
1f850 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
1f860 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1f870 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1f880 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
1f890 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
1f8a0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
1f8b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1f8c0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1f8d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1f8e0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1f8f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f900 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1f910 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
1f920 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
1f930 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f940 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1f950 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
1f960 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f980 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f990 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
1f9a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f9b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
1f9d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f9e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1f9f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1fa00 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
1fa10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1fa20 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1fa30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa40 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
1fa50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1fa60 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1fa70 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1fa80 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1fa90 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1faa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1fab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1fac0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
1fad0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
1fae0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c  /.        int cl
1faf0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
1fb00 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
1fb10 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1fb20 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
1fb30 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
1fb40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb50 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1fb60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fb70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fb80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1fb90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1fba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fbb0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
1fbc0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
1fbd0 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
1fbe0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1fbf0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
1fc00 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1fc10 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1fc20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
1fc30 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
1fc40 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1fc50 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1fc70 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
1fc80 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
1fc90 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
1fca0 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
1fcb0 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
1fcc0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
1fcd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1fce0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
1fd00 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
1fd10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1fd20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fd30 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1fd40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1fd50 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
1fd60 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1fd70 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
1fd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
1fd90 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
1fda0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
1fdb0 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67         Pgno nPag
1fdc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  e;.          *pP
1fdd0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
1fde0 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70         nPage = p
1fdf0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1fe00 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
1fe10 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29  ( *pPgno>nPage )
1fe20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1fe30 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74   Free page off t
1fe40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1fe50 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
1fe60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1fe70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fe80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1fe90 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1fea0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1feb0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1fec0 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1fed0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1fee0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1fef0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1ff00 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1ff10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ff20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1ff30 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1ff40 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1ff50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1ff60 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1ff70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1ff80 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1ff90 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1ffa0 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1ffb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1ffc0 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1ffd0 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1ffe0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1fff0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
20000 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  le(pTrunk->pDbPa
20010 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
20020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20030 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
20040 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
20050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
20080 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
20090 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29  llback((*ppPage)
200a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
200b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
200c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
200d0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
200e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
200f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
20110 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20120 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
20130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
20150 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
20160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20170 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20180 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
20190 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
201a0 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
201b0 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
201c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
201d0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
201e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
201f0 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
20200 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
20210 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
20220 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
20230 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
20240 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
20250 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20   *pPgno = nPage 
20260 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
20270 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20280 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
20290 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
202a0 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63    /* An incr-vac
202b0 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  uum has already 
202c0 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  run within this 
202d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
202e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
202f0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73  e to allocate is
20300 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68   not from the ph
20310 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68  ysical end of th
20320 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20  e file, but.    
20330 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72    ** at pBt->nTr
20340 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  unc. .      */. 
20350 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42       *pPgno = pB
20360 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20  t->nTrunc+1;.   
20370 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
20380 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20390 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
203a0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
203b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
203c0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
203d0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
203e0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
203f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
20400 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
20410 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
20420 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
20430 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
20440 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
20450 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
20460 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
20470 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
20480 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
20490 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
204a0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
204b0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
204c0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
204d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
204e0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
204f0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
20500 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
20510 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
20520 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
20530 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
20540 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20550 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50  t) );.      (*pP
20560 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  gno)++;.      if
20570 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
20580 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20590 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20   ){ (*pPgno)++; 
205a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
205b0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
205c0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63       pBt->nTrunc
205d0 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d   = *pPgno;.    }
205e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
205f0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
20600 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20610 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
20620 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
20630 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
20640 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
20650 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
20660 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
20670 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20680 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
20690 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
206a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
206b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
206c0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
206d0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
206e0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
206f0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
20700 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
20710 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
20720 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20730 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
20740 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
20750 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
20760 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
20770 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
20780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20790 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
207a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
207b0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
207c0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
207d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
207e0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
207f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20800 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20810 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
20820 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
20830 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20840 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
20850 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
20860 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
20870 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
20880 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20890 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
208a0 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
208b0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
208c0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
208d0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
208e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
208f0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
20900 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
20910 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
20920 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
20930 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
20940 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
20950 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20960 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
20970 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
20980 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
20990 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
209a0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 0a 20 20  >isInit = 0;..  
209b0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
209c0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
209d0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
209e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
209f0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
20a00 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
20a10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20a20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
20a30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20a40 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
20a50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20a60 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
20a70 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
20a80 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
20a90 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
20aa0 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
20ab0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
20ac0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
20ad0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
20ae0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
20af0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
20b00 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
20b10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20b20 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20b30 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
20b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
20b50 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
20b60 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
20b70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
20b80 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
20b90 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
20ba0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
20bb0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
20bc0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
20bd0 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
20be0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
20bf0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
20c00 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
20c10 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  M ){.    rc = pt
20c20 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
20c30 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
20c40 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
20c50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20c60 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
20c70 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
20c80 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
20c90 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
20ca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20cb0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20cc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20cd0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20ce0 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  rc;.    memset(p
20cf0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
20d00 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  8);.    put4byte
20d10 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20d20 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
20d30 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46  );.    TRACE(("F
20d40 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72  REE-PAGE: %d fir
20d50 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  st\n", pPage->pg
20d60 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
20d70 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65     /* Other free
20d80 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65   pages already e
20d90 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74  xist.  Retrive t
20da0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  he first trunk p
20db0 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  age.    ** of th
20dc0 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66  e freelist and f
20dd0 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ind out how many
20de0 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20   leaves it has. 
20df0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
20e00 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d  pTrunk;.    rc =
20e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
20e20 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
20e30 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20e40 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c  a[32]), &pTrunk,
20e50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20e60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20e70 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
20e80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
20e90 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
20ea0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
20eb0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
20ec0 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
20ed0 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
20ee0 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
20ef0 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
20f00 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
20f10 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20 20 20   no leaves..    
20f20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
20f30 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
20f40 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
20f50 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
20f60 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
20f70 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
20f80 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
20f90 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
20fa0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
20fb0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
20fc0 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
20fd0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
20fe0 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
20ff0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
21000 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
21010 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
21020 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
21030 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
21040 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
21050 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
21060 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
21070 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
21080 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
21090 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
210a0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
210b0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
210c0 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
210d0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
210e0 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
210f0 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
21100 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21110 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
21120 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
21130 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
21140 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
21150 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
21160 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
21170 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
21180 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
21190 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
211a0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
211b0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
211c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
211d0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
211e0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
211f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
21200 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21210 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21220 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
21230 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
21240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21250 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
21260 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
21270 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
21280 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
21290 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
212a0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  4], 0);.        
212b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
212c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
212d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
212e0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
212f0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
21300 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
21310 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
21320 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
21330 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
21340 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
21350 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20    }else if( k<0 
21360 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
21370 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
21380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
21390 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
213a0 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
213b0 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
213c0 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
213d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
213e0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
213f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
21420 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
21430 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
21440 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
21450 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
21460 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
21470 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
21480 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
21490 45 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ETE.        rc =
214a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
214b0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
214c0 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  bPage);.#endif. 
214d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
214e0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
214f0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
21500 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
21510 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
21520 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
21530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
21540 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runk);.  }.  ret
21550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21560 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
21570 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
21580 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
21590 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
215a0 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
215b0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
215c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
215d0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
215e0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
215f0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
21600 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
21610 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
21620 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
21630 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a   int ovflPageSiz
21640 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
21650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21660 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
21670 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
21680 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21690 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
216a0 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
216b0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
216c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
216d0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
216e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
216f0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
21700 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
21710 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
21720 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
21730 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
21740 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69  ]);.  ovflPageSi
21750 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
21760 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
21770 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
21780 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
21790 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
217a0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
217b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
217c0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
217d0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
217e0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d  nOvfl-- ){.    M
217f0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20  emPage *pOvfl;. 
21800 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d     if( ovflPgno=
21810 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70  =0 || ovflPgno>p
21820 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
21830 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
21840 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21850 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
21860 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
21870 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
21880 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
21890 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
218a0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
218b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
218c0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
218d0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
218e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
218f0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
21900 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
21910 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
21920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
21940 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
21950 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
21960 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
21970 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
21980 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
21990 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
219a0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
219b0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
219c0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
219d0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
219e0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
219f0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
21a00 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
21a10 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
21a20 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
21a30 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
21a40 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
21a50 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
21a60 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
21a70 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
21a80 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21a90 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
21aa0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
21ab0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
21ac0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
21ad0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
21ae0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
21af0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
21b00 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
21b10 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
21b20 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
21b30 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
21b40 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
21b50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b70 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
21b80 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
21b90 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
21ba0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
21bb0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
21bc0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
21bd0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
21be0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
21bf0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
21c00 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
21c10 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
21c20 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
21c30 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
21c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c50 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
21c60 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
21c70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
21c80 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
21cb0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
21cc0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
21cd0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
21ce0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
21cf0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
21d00 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
21d10 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
21d20 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
21d30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
21d40 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
21d50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21d60 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
21d70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
21d80 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
21d90 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
21da0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
21db0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
21dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21dd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
21de0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
21df0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
21e00 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
21e10 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
21e20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
21e30 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
21e40 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
21e50 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
21e60 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
21e70 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
21e80 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
21e90 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
21ea0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
21eb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
21ec0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
21ed0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
21ee0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
21ef0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
21f00 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
21f10 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
21f20 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
21f30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
21f40 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
21f50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
21f60 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
21f70 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21f80 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
21f90 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
21fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
21fb0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
21fc0 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
21fd0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
21fe0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
21ff0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c  4*)&nKey);.  sql
22000 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
22010 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
22020 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
22030 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
22040 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
22050 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
22060 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
22070 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
22080 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
22090 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
220a0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
220b0 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
220c0 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
220d0 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
220e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
220f0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
22100 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
22110 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
22120 65 6c 73 65 7b 20 0a 20 20 20 20 2f 2a 20 54 42  else{ .    /* TB
22130 44 3a 20 20 50 65 72 68 61 70 73 20 72 61 69 73  D:  Perhaps rais
22140 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
22150 20 69 66 20 6e 4b 65 79 20 69 73 20 6c 61 72 67   if nKey is larg
22160 65 72 20 74 68 61 6e 20 33 31 20 62 69 74 73 3f  er than 31 bits?
22170 20 2a 2f 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   */.    nPayload
22180 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
22190 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
221a0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
221b0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
221c0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
221d0 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
221e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
221f0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
22200 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
22210 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
22220 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
22230 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
22240 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
22250 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
22260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22270 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
22280 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
22290 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
222a0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
222b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
222c0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
222d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
222e0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
222f0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
22300 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
22310 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
22320 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
22330 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
22340 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
22350 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22360 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
22370 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
22380 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
22390 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
223a0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
223b0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
223c0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
223d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
223e0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
223f0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
22400 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
22410 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
22420 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
22430 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
22440 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
22450 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
22460 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
22470 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
22480 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
22490 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
224a0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
224b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
224c0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
224d0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
224e0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
224f0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
22500 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
22510 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
22520 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
22530 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
22540 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
22550 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
22560 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
22570 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
22580 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
22590 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
225a0 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
225b0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
225c0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
225d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
225e0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
225f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
22600 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
22610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22620 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
22630 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
22640 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
22650 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
22660 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
22670 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
22680 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
22690 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
226a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
226b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
226c0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
226d0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
226e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
226f0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
22700 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
22710 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22720 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
22730 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
22740 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
22750 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
22760 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
22770 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
22780 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
22790 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
227a0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
227b0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
227c0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
227d0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
227e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
227f0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
22800 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
22810 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
22820 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
22830 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
22840 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
22850 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
22860 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
22870 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
22880 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
22890 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
228a0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
228b0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
228c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
228d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
228e0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
228f0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
22900 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
22910 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
22920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22930 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
22940 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
22950 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
22960 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
22970 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
22980 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
22990 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
229a0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
229b0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
229c0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
229d0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
229e0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
229f0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
22a00 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
22a10 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
22a20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
22a30 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
22a40 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
22a50 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
22a60 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
22a70 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
22a80 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
22a90 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
22aa0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
22ab0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
22ac0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22ad0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
22ae0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
22af0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
22b00 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
22b10 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
22b20 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
22b30 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
22b40 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
22b50 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
22b60 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
22b70 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
22b80 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
22b90 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
22ba0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
22bb0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
22bc0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
22bd0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
22be0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
22bf0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
22c00 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
22c10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
22c20 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
22c30 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
22c40 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
22c50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
22c60 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
22c70 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
22c80 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
22c90 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
22ca0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
22cb0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
22cc0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
22cd0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
22ce0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
22cf0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
22d00 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
22d10 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
22d20 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
22d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22d40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
22d50 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
22d60 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
22d70 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
22d80 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
22d90 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22da0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
22db0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
22dc0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
22dd0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
22de0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
22df0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
22e00 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
22e10 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
22e20 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
22e30 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
22e40 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
22e50 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
22e60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
22e70 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
22e80 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43  static int dropC
22e90 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
22ea0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
22eb0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
22ec0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22ed0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
22ee0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
22ef0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
22f00 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
22f10 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
22f20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
22f30 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
22f40 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
22f50 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
22f60 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
22f70 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
22f80 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
22f90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
22fa0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
22fb0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
22fc0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
22fd0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
22fe0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
22ff0 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
23000 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
23010 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
23020 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
23030 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23040 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
23050 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23060 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
23070 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
23080 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
23090 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
230a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
230b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28  byte(ptr);.  if(
230c0 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f   (pc<pPage->hdrO
230d0 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
230e0 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20  leaf?0:4)).     
230f0 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d  || (pc+sz>pPage-
23100 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
23110 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
23120 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23130 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
23140 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
23150 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
23160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23170 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23180 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
23190 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
231a0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
231b0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
231c0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
231d0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
231e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
231f0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
23200 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
23210 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
23220 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
23230 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74  Free += 2;.  ret
23240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23250 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
23260 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
23270 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
23280 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
23290 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
232a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
232b0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
232c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
232d0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
232e0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
232f0 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
23300 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
23310 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
23320 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
23330 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
23340 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
23350 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
23360 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
23370 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
23380 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
23390 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
233a0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
233b0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
233c0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
233d0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
233e0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
233f0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
23400 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
23410 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
23420 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
23430 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
23440 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23450 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
23460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
23470 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
23480 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
23490 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
234a0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
234b0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
234c0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
234d0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
234e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
234f0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
23500 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
23510 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
23520 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
23530 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
23540 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
23550 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
23560 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
23570 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
23580 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
23590 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
235a0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
235b0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
235c0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
235d0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
235e0 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
235f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
23600 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
23610 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
23620 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
23630 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
23640 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
23650 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
23660 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
23670 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
23680 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
23690 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
236a0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
236b0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
236c0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
236d0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
236e0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
236f0 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
23700 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
23710 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
23720 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
23730 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
23740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23750 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
23760 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
23770 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
23780 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
23790 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
237a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
237b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
237c0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
237d0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
237e0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
237f0 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
23800 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
23810 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
23820 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
23830 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
23840 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
23850 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
23860 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
23870 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
23880 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
23890 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
238a0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
238b0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
238c0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
238d0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
238e0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
238f0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
23900 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
23910 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
23920 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
23930 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
23940 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
23950 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
23960 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
23970 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
23980 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
23990 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
239a0 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
239b0 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
239c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
239d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
239e0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
239f0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
23a00 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
23a10 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
23a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
23a30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23a40 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
23a50 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
23a60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
23a70 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
23a80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
23a90 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
23aa0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
23ab0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
23ac0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
23ad0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
23ae0 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
23af0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
23b00 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
23b10 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
23b20 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
23b30 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
23b40 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
23b50 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
23b60 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
23b70 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
23b80 20 28 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61   (u16)i;.    pPa
23b90 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
23ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
23bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23bc0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
23bd0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
23be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23bf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23c10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
23c20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
23c30 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
23c40 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
23c50 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
23c60 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
23c70 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
23c80 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23c90 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
23ca0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
23cb0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
23cc0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
23cd0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
23ce0 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
23cf0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
23d00 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
23d10 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
23d20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
23d30 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
23d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
23d70 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67   }.      top = g
23d80 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
23d90 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
23da0 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
23db0 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
23dc0 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
23dd0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
23de0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
23df0 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
23e00 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
23e10 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
23e20 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b   );.    if (idx+
23e30 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
23e40 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20  >usableSize) {. 
23e50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23e60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23e70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
23e80 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
23e90 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
23ea0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
23eb0 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
23ec0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
23ed0 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
23ee0 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
23ef0 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
23f00 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
23f10 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
23f20 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
23f30 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
23f40 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
23f50 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
23f60 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
23f70 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
23f80 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
23f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23fa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
23fb0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
23fc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23fd0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
23fe0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
23ff0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
24000 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
24010 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
24020 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
24030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
24040 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
24050 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
24060 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
24070 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
24080 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
24090 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
240a0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73  &info);.      as
240b0 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
240c0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
240d0 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
240e0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
240f0 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f  .      if( (info
24100 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
24110 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
24120 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
24130 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
24140 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
24150 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
24160 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
24170 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
24180 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
24190 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
241a0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
241b0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
241c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
241d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
241e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
241f0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
24200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24210 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
24220 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
24230 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
24240 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
24250 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
24260 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
24270 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
24280 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
24290 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
242a0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
242b0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
242c0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
242d0 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
242e0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
242f0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
24300 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
24310 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
24320 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
24330 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
24340 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
24350 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
24360 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
24370 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
24380 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
24390 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
243a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
243b0 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54  talSize;    /* T
243c0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  otal size of all
243d0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20   cells */.  int 
243e0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
243f0 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68   Index of page h
24400 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
24410 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20  ellptr;      /* 
24420 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
24430 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
24440 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
24450 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
24460 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
24470 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
24480 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
24490 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
244a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
244b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
244c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
244d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
244e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
244f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
24500 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
24510 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
24520 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
24530 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
24540 36 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  60 );.  totalSiz
24550 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
24560 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
24570 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
24580 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
24590 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
245a0 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
245b0 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
245c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
245d0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
245e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
245f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
24600 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
24610 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
24620 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
24630 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
24640 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
24650 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
24660 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
24670 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
24680 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
24690 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
246a0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
246b0 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
246c0 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
246d0 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
246e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
246f0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
24700 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
24710 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
24720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
24730 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
24740 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
24750 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
24760 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
24770 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
24780 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
24790 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
247a0 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
247b0 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
247c0 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
247d0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
247e0 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
247f0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
24800 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
24810 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
24820 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
24830 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
24840 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
24850 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
24860 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
24870 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
24880 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
24890 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
248a0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
248b0 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
248c0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
248d0 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
248e0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
248f0 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
24900 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
24910 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
24920 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
24930 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
24940 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
24950 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
24960 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
24970 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
24980 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
24990 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
249a0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
249b0 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
249c0 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
249d0 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
249e0 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
249f0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
24a00 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
24a10 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
24a20 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
24a30 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
24a40 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
24a50 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
24a60 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
24a70 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
24a80 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
24a90 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
24aa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
24ab0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
24ac0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
24ad0 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
24ae0 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
24af0 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
24b00 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
24b10 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
24b20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
24b30 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
24b40 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b  BtCursor*, int);
24b50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24b60 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
24b70 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
24b80 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
24b90 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
24ba0 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
24bb0 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
24bc0 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
24bd0 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
24be0 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
24bf0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
24c00 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
24c10 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
24c20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
24c30 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
24c40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
24c50 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
24c60 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61  d of trying bala
24c70 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
24c80 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
24c90 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
24ca0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
24cb0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
24cc0 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
24cd0 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
24ce0 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
24cf0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
24d00 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
24d10 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
24d20 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
24d30 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
24d40 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
24d50 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
24d60 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
24d70 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
24d80 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
24d90 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
24da0 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
24db0 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
24dc0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
24dd0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
24de0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24df0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
24e00 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
24e10 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
24e20 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
24e30 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
24e40 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
24e50 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
24e60 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
24e70 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
24e80 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
24e90 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ick(BtCursor *pC
24ea0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
24eb0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
24ec0 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   0;.  Pgno pgnoN
24ed0 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
24ee0 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20  .  u16 szCell;. 
24ef0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
24f00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24f10 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
24f30 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
24f40 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24f50 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
24f60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
24f70 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
24f80 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
24f90 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
24fa0 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
24fb0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
24fc0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
24fd0 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
24fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24ff0 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
25000 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
25010 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25030 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
25040 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
25050 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
25060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25070 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
25080 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ex) );..  /* All
25090 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
250a0 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
250b0 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
250c0 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
250d0 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
250e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
250f0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
25100 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
25110 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
25120 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
25130 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
25140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25150 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67      pCell = pPag
25160 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
25170 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20  l;.    szCell = 
25180 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
25190 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61  e, pCell);.    a
251a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
251b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
251c0 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
251d0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
251e0 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
251f0 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  [0]);.    assemb
25200 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
25210 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
25220 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
25230 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20  erflow = 0;.  . 
25240 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63     /* pPage is c
25250 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67  urrently the rig
25260 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72  ht-child of pPar
25270 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73  ent. Change this
25280 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
25290 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
252a0 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
252b0 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
252c0 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65  and.    ** pPage
252d0 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
252e0 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
252f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f    **.    ** Igno
25300 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  re the return va
25310 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20  lue of the call 
25320 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e  to fillInCell().
25330 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20   fillInCell().  
25340 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65    ** may only re
25350 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  turn other than 
25360 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20  SQLITE_OK if it 
25370 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  is required to a
25380 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f  llocate.    ** o
25390 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
253a0 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65  low pages. Since
253b0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62   an internal tab
253c0 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a  le B-Tree cell .
253d0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72      ** may never
253e0 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f   spill over onto
253f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25400 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d  e (it is a maxim
25410 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33  um of .    ** 13
25420 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c   bytes in size),
25430 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65   it is not necce
25440 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74  ssary to check t
25450 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  he return code..
25460 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69      **.    ** Si
25470 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73  milarly, the ins
25480 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69  ertCell() functi
25490 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  on cannot fail i
254a0 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  f the page.    *
254b0 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  * being inserted
254c0 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79   into is already
254d0 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68   writable and th
254e0 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
254f0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  .    ** contain 
25500 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e  an overflow poin
25510 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  ter. So ignore t
25520 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20  his return code 
25530 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
25540 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
25550 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43  Cell>0 );.    pC
25560 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
25570 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
25580 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ll-1);.    sqlit
25590 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
255a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
255b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69  , &info);.    fi
255c0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
255d0 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c  , parentCell, 0,
255e0 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
255f0 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65  , 0, &parentSize
25600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25610 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
25620 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
25630 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
25640 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
25650 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73  Page) );.    ins
25660 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
25670 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65   parentIdx, pare
25680 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69  ntCell, parentSi
25690 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70  ze, 0, 4);.    p
256a0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
256b0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
256c0 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61  ,parentIdx), pPa
256d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ge->pgno);.    p
256e0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
256f0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
25700 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
25710 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
25720 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
25730 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
25740 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
25750 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
25760 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
25770 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
25780 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
25790 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
257a0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
257b0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
257c0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a  flow page..    *
257d0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
257e0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
257f0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
25800 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
25810 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
25820 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt->pgno);.     
25830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
25850 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
25860 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20  (pNew, 0);.     
25870 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25880 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
25890 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
258a0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
258b0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
258c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
258d0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50  his point the pP
258e0 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61  age->nFree varia
258f0 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63  ble is not set c
25900 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20  orrectly with.  
25910 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74 68  ** respect to th
25920 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
25930 20 70 61 67 65 20 28 62 65 63 61 75 73 65 20 69   page (because i
25940 74 20 77 61 73 20 73 65 74 20 74 6f 20 30 20 62  t was set to 0 b
25950 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65  y .  ** insertCe
25960 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c  ll). So call sql
25970 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
25980 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  e() to make sure
25990 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72   it is.  ** corr
259a0 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ect..  **.  ** T
259b0 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f  his has to be do
259c0 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  ne even if an er
259d0 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
259e0 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  rned. Normally, 
259f0 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  if.  ** an error
25a00 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
25a10 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  ree balancing, t
25a20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d  he contents of M
25a30 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20  emPage are.  ** 
25a40 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61  not important, a
25a50 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72  s they will be r
25a60 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e  ecalculated when
25a70 20 74 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c   the page is rol
25a80 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42  led.  ** back. B
25a90 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61  ut here, in bala
25aa0 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20  nce_quick(), it 
25ab0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
25ac0 20 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a   pPage has .  **
25ad0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61   not yet been ma
25ae0 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77 72  rked dirty or wr
25af0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
25b00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
25b10 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77  refore.  ** it w
25b20 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65  ill not be rolle
25b30 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74  d back and so it
25b40 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
25b50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
25b60 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61    ** the page da
25b70 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20  ta and contents 
25b80 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63  of MemPage are c
25b90 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  onsistent..  */.
25ba0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
25bb0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
25bc0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
25bd0 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65  e);..  /* If eve
25be0 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63  rything else suc
25bf0 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20  ceeded, balance 
25c00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
25c10 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74   in .  ** case t
25c20 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
25c30 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
25c40 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
25c50 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  rfull..  */.  if
25c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25c70 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
25c80 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70  ge(pPage);.    p
25c90 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
25ca0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
25cb0 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Cur, 0);.  }.  r
25cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
25cd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
25ce0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
25cf0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
25d00 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
25d10 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
25d20 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
25d30 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
25d40 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
25d50 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
25d60 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
25d70 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
25d80 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
25d90 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
25da0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
25db0 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
25dc0 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
25dd0 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
25de0 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
25df0 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
25e00 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
25e10 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
25e20 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
25e30 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
25e40 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
25e50 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
25e60 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
25e70 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
25e80 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
25e90 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
25ea0 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
25eb0 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
25ec0 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
25ed0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
25ee0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
25ef0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
25f00 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
25f10 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
25f20 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
25f30 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
25f40 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
25f50 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
25f60 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
25f70 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
25f80 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
25f90 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
25fa0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
25fb0 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
25fc0 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
25fd0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
25fe0 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
25ff0 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
26000 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
26010 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
26020 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
26030 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
26040 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
26050 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
26060 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
26070 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
26080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26090 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
260a0 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
260b0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
260c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
260d0 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
260e0 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
260f0 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
26100 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
26110 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
26120 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
26130 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
26140 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
26150 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
26160 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
26170 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
26180 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
26190 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
261a0 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
261b0 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
261c0 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
261d0 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
261e0 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
261f0 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
26200 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
26210 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
26220 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
26230 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
26240 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
26250 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
26260 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
26270 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
26280 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
26290 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
262a0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
262b0 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
262c0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
262d0 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
262e0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
262f0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
26300 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26310 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
26320 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
26330 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72 20   /* The over or 
26340 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20 74  underfull page t
26350 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d  o balance */.  M
26360 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
26370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26380 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
26390 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
263a0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
263b0 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
263c0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
263d0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263f0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
26400 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
26410 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
26420 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
26430 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
26440 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
26450 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
26460 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
26470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26480 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
26490 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
264a0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
264b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
264c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
264d0 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
264e0 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
264f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26500 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
26510 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
26520 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
26530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26540 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
26550 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26570 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
26580 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
26590 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
265a0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
265b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
265c0 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
265d0 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
265e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
26610 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
26620 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
26630 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
26640 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
26650 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
26660 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
26670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26680 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
26690 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
266a0 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
266b0 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
266c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
266d0 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
266e0 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
266f0 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
26700 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
26710 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
26720 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
26730 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
26760 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
26770 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
26780 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20  nt iSpace1 = 0; 
26790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
267a0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
267b0 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f   of aSpace1[] */
267c0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d  .  int iSpace2 =
267d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
267e0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
267f0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b  byte of aSpace2[
26800 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
26810 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
26820 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
26830 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
26840 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
26850 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
26860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
26870 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
26880 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
26890 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
268a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
268b0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
268c0 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
268d0 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
268e0 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
268f0 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
26900 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
26910 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
26920 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
26930 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
26940 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
26950 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
26960 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
26970 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
26980 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
26990 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
269a0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
269b0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
269c0 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
269d0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
269e0 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
269f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
26a00 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
26a10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
26a20 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
26a30 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
26a40 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
26a50 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
26a60 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
26a70 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
26a80 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
26a90 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
26aa0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
26ab0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
26ac0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
26ad0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
26b00 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
26b10 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
26b20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
26b30 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
26b40 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
26b50 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
26b60 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
26b70 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
26b80 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
26b90 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f  iders cells befo
26ba0 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  re balance */.  
26bb0 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b  u8 *aSpace2 = 0;
26bc0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
26bd0 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76  for overflow div
26be0 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65  iders cells afte
26bf0 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  r balance */.  u
26c00 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20  8 *aFrom = 0;.. 
26c10 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
26c20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26c30 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e];.  assert( sq
26c40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26c50 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
26c60 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ex) );.  VVA_ONL
26c70 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
26c80 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a 20  uffled = 1 );.. 
26c90 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74   /* .  ** Find t
26ca0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
26cb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
26cc0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
26cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26ce0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
26cf0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
26d00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
26d10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
26d20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
26d30 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
26d40 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
26d50 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
26d60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26d70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  1];.  assert( pP
26d80 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53  arent );.  if( S
26d90 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
26da0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26db0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
26dc0 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ge)) ){.    retu
26dd0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 54 52  rn rc;.  }..  TR
26de0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
26df0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
26e00 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
26e10 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
26e20 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
26e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26e40 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
26e50 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
26e60 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
26e70 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
26e80 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
26e90 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
26ea0 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
26eb0 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
26ec0 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
26ed0 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
26ee0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
26ef0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
26f00 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
26f10 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
26f20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
26f30 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
26f40 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
26f50 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
26f60 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
26f70 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
26f80 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
26f90 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
26fa0 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
26fb0 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
26fc0 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
26fd0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
26fe0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
26ff0 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
27000 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
27010 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
27020 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20  low==1 &&.      
27030 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
27040 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
27050 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 72 65  l &&.      pPare
27060 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
27070 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
27080 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
27090 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
270a0 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
270b0 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  o.  ){.    asser
270c0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
270d0 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   );.    /*.    *
270e0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
270f0 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
27100 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
27110 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
27120 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
27130 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
27140 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
27150 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
27160 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
27170 71 75 69 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d  quick(pCur);.  }
27180 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53  .#endif..  if( S
27190 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
271a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
271b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
271c0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
271d0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   rc;.  }..  /*. 
271e0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c   ** Find the cel
271f0 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  l in the parent 
27200 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20  page whose left 
27210 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63  child points bac
27220 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e  k.  ** to pPage.
27230 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69    The "idx" vari
27240 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65  able is the inde
27250 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20  x of that cell. 
27260 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69   If pPage.  ** i
27270 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  s the rightmost 
27280 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
27290 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f   then set idx to
272a0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
272b0 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43  .  */.  idx = pC
272c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
272d0 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65  iPage-1];.  asse
272e0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 70 50  rtParentIndex(pP
272f0 61 72 65 6e 74 2c 20 69 64 78 2c 20 70 50 61 67  arent, idx, pPag
27300 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  e->pgno);..  /*.
27310 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
27320 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61  variables so tha
27330 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66  t it will be saf
27340 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64  e to jump.  ** d
27350 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e  irectly to balan
27360 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e  ce_cleanup at an
27370 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  y moment..  */. 
27380 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30   nOld = nNew = 0
27390 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
273a0 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
273b0 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
273c0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
273d0 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
273e0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
273f0 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
27400 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
27410 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
27420 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
27430 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
27440 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
27450 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
27460 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
27470 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
27480 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
27490 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
274a0 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
274b0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
274c0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
274d0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
274e0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
274f0 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
27500 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
27510 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
27520 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
27530 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
27540 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
27550 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
27560 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
27570 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
27580 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
27590 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
275a0 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
275b0 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
275c0 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
275d0 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
275e0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
275f0 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
27600 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
27610 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
27620 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
27630 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
27640 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
27650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
27660 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
27670 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
27680 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
27690 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
276a0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
276b0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
276c0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
276d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
276e0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
276f0 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
27700 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
27710 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
27720 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27730 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64   /* apOld[i]->id
27740 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a  xParent = k; */.
27750 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
27760 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
27770 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
27780 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
27790 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
277a0 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
277b0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
277c0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
277d0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
277e0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
277f0 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
27800 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
27810 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
27820 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
27830 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
27840 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
27850 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
27860 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a  ctures.  */.  sz
27870 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
27880 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
27890 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278b0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
278c0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
278d0 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278f0 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
27900 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28   (ROUND8(sizeof(
27910 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70  MemPage))+pBt->p
27920 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20  ageSize)*NB  /* 
27930 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20  aCopy */.     + 
27940 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
27970 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
27980 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
27990 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b   nMaxCells : 0);
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
279b0 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c  aFrom */.  apCel
279c0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
279d0 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
279e0 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
279f0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
27a00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27a10 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
27a20 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
27a30 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
27a40 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
27a50 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
27a60 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
27a70 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
27a80 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
27a90 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
27aa0 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
27ab0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
27ac0 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28  quired */.  for(
27ad0 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b  i=1; i<NB; i++){
27ae0 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20  .    aCopy[i] = 
27af0 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d  &aCopy[i-1][pBt-
27b00 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
27b10 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
27b20 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  )];.    assert( 
27b30 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38  ((aCopy[i] - (u8
27b40 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
27b50 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
27b60 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
27b70 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
27b80 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  e1 = &aCopy[NB-1
27b90 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
27ba0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
27bb0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
27bc0 72 74 28 20 28 28 61 53 70 61 63 65 31 20 2d 20  rt( ((aSpace1 - 
27bd0 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
27be0 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
27bf0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
27c00 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 49 53  ired */.  if( IS
27c10 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
27c20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63    aFrom = &aSpac
27c30 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e1[pBt->pageSize
27c40 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 32  ];.  }.  aSpace2
27c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
27c60 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53 69  lloc(pBt->pageSi
27c70 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70 61 63  ze);.  if( aSpac
27c80 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  e2==0 ){.    rc 
27c90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
27ca0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
27cb0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
27cc0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  /*.  ** Make 
27cd0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f  copies of the co
27ce0 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61  ntent of pPage a
27cf0 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
27d00 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a  into aOld[]..  *
27d10 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
27d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
27d30 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
27d40 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
27d50 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f  .  ** that the o
27d60 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69  riginal pages si
27d70 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nce the original
27d80 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69   pages will be i
27d90 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65  n the.  ** proce
27da0 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
27db0 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
27dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
27dd0 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
27de0 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69  ge *p = apCopy[i
27df0 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43  ] = (MemPage*)aC
27e00 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  opy[i];.    memc
27e10 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  py(p, apOld[i], 
27e20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
27e30 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
27e40 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20   (void*)&p[1];. 
27e50 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61     memcpy(p->aDa
27e60 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
27e70 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
27e80 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ze);.  }..  /*. 
27e90 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
27ea0 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
27eb0 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
27ec0 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
27ed0 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
27ee0 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
27ef0 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
27f00 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
27f10 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
27f20 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
27f30 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65  ined form aSpace
27f40 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
27f50 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
27f60 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
27f70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
27f80 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
27f90 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
27fa0 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
27fb0 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
27fc0 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
27fd0 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
27fe0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
27ff0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
28000 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
28010 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
28020 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
28030 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
28040 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
28050 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
28060 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
28070 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
28080 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
28090 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
280a0 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
280b0 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
280c0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
280d0 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
280e0 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
280f0 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
28100 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
28110 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
28120 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
28130 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
28140 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
28150 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
28160 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
28170 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
28180 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c  ys..  */.  nCell
28190 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72   = 0;.  leafCorr
281a0 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e  ection = pPage->
281b0 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
281c0 74 61 20 3d 20 70 50 61 67 65 2d 3e 68 61 73 44  ta = pPage->hasD
281d0 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
281e0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
281f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
28200 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  = apCopy[i];.   
28210 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c   int limit = pOl
28220 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e  d->nCell+pOld->n
28230 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f  Overflow;.    fo
28240 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20  r(j=0; j<limit; 
28250 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  j++){.      asse
28260 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
28270 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43  lls );.      apC
28280 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
28290 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f  dOverflowCell(pO
282a0 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a  ld, j);.      sz
282b0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65  Cell[nCell] = ce
282c0 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20  llSizePtr(pOld, 
282d0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a  apCell[nCell]);.
282e0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
282f0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
28300 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20    int a;.       
28310 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
28320 28 75 38 29 69 3b 20 20 20 61 73 73 65 72 74 28  (u8)i;   assert(
28330 20 69 3e 3d 30 20 26 26 20 69 3c 36 20 29 3b 0a   i>=0 && i<6 );.
28340 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b          for(a=0;
28350 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   a<pOld->nOverfl
28360 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; a++){.      
28370 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f      if( pOld->aO
28380 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70  vfl[a].pCell==ap
28390 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20  Cell[nCell] ){. 
283a0 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d             aFrom
283b0 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
283c0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
283d0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
283e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
283f0 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
28400 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
28410 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20  nOld-1 ){.      
28420 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a  u16 sz = cellSiz
28430 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
28440 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  Div[i]);.      i
28450 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
28460 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74         /* With t
28470 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67  he LEAFDATA flag
28480 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20  , pParent cells 
28490 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59  hold only INTKEY
284a0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
284b0 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  * are duplicates
284c0 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20   of keys on the 
284d0 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65  child pages.  We
284e0 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a   need to remove.
284f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
28500 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
28510 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74  m pParent, but t
28520 68 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  he dividers cell
28530 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20  s are not.      
28540 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70    ** added to ap
28550 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74  Cell[] because t
28560 68 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74  hey are duplicat
28570 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c  es of child cell
28580 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
28590 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
285a0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
285b0 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
285c0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65  .        u8 *pTe
285d0 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
285e0 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
285f0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lls );.        s
28600 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
28610 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  z;.        pTemp
28620 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61   = &aSpace1[iSpa
28630 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  ce1];.        iS
28640 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace1 += sz;.   
28650 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
28660 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
28670 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
28680 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
28690 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
286a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
286b0 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  mp, apDiv[i], sz
286c0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
286d0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70  l[nCell] = pTemp
286e0 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  +leafCorrection;
286f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41  .        if( ISA
28700 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
28710 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
28720 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
28730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 72      }.        dr
28740 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
28750 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
28760 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
28770 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
28780 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
28790 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  =4 );.        sz
287a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 28  Cell[nCell] -= (
287b0 75 31 36 29 6c 65 61 66 43 6f 72 72 65 63 74 69  u16)leafCorrecti
287c0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  on;.        asse
287d0 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65  rt( get4byte(pTe
287e0 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20  mp)==pgnoOld[i] 
287f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
28800 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
28810 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28820 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
28830 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 );.          /
28840 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
28850 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
28860 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
28870 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
28880 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
28890 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
288a0 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
288b0 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
288c0 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
288d0 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66  Data[pOld->hdrOf
288e0 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20  fset+8], 4);.   
288f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
28910 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
28920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28930 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34   szCell[nCell]<4
28940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28950 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
28960 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65  any cells smalle
28970 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20  r than 4 bytes. 
28980 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
28990 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
289a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
289b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
289c0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
289d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
289e0 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
289f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
28a00 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
28a10 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
28a20 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
28a30 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
28a40 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
28a50 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
28a60 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
28a70 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
28a80 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
28a90 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
28aa0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
28ab0 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
28ac0 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
28ad0 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
28ae0 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
28af0 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
28b00 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
28b10 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
28b20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
28b30 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
28b40 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
28b50 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
28b60 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
28b70 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
28b80 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
28b90 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
28ba0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
28bb0 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
28bc0 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
28bd0 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
28be0 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
28bf0 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
28c10 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
28c20 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
28c30 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
28c40 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
28c50 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
28c60 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
28c70 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
28c80 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
28c90 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
28ca0 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
28cb0 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
28cc0 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
28cd0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
28ce0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
28cf0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
28d00 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
28d10 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
28d20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
28d30 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
28d40 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
28d50 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
28d60 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
28d70 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
28d80 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
28d90 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
28da0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
28db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  ;.    }.  }.  sz
28dc0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
28dd0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
28de0 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
28df0 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
28e00 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
28e10 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
28e20 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
28e30 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
28e40 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
28e50 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
28e60 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
28e70 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
28e80 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
28e90 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
28ea0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
28eb0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
28ec0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
28ed0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
28ee0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
28ef0 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
28f00 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
28f10 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
28f20 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
28f30 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
28f40 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
28f50 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
28f60 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
28f70 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
28f80 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
28f90 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
28fa0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
28fb0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
28fc0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
28fd0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
28fe0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
28ff0 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
29000 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
29010 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
29020 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
29030 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
29040 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
29050 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
29060 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
29070 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
29080 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
29090 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
290a0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
290b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
290c0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
290d0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
290e0 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
290f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29100 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
29110 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
29120 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
29130 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
29140 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
29150 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
29160 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
29170 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
29180 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
29190 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
291a0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
291b0 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
291c0 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
291d0 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
291e0 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
291f0 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
29200 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
29210 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
29220 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
29230 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
29240 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
29250 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
29260 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
29270 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
29280 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
29290 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
292a0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
292b0 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
292c0 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
292d0 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
292e0 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a   we are the.  **
292f0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
29300 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
29310 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
29320 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
29330 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
29340 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
29350 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
29360 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
29370 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
29380 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
29390 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
293a0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
293b0 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  0) );..  /*.  **
293c0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
293d0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
293e0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
293f0 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  ssible..  */.  a
29400 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
29410 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c  no>1 );.  pageFl
29420 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ags = pPage->aDa
29430 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
29440 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
29450 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
29460 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
29470 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
29480 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
29490 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
294a0 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69  w[i] = pgnoOld[i
294b0 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
294c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
294d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
294e0 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
294f0 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
29500 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
29510 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
29520 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
29530 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29540 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
29550 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
29560 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
29570 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
29580 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
29590 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
295a0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
295b0 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
295c0 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  i] = pNew;.     
295d0 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nNew++;.    }. 
295e0 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
295f0 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74  y old pages that
29600 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64   were not reused
29610 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20   as new pages.. 
29620 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   */.  while( i<n
29630 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Old ){.    rc = 
29640 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
29650 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
29660 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
29670 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61  eanup;.    relea
29680 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
29690 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d  ;.    apOld[i] =
296a0 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d   0;.    i++;.  }
296b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20  ..  /*.  ** Put 
296c0 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e  the new pages in
296d0 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
296e0 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f  .  This helps to
296f0 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69  .  ** keep entri
29700 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
29710 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20  ile in order so 
29720 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a  that a scan.  **
29730 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
29740 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
29750 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e  hrough the file.
29760 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74    That.  ** in t
29770 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70  urn helps the op
29780 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74  erating system t
29790 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a  o deliver pages.
297a0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69    ** from the di
297b0 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e  sk more rapidly.
297c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28  .  **.  ** An O(
297d0 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73  n^2) insertion s
297e0 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ort algorithm is
297f0 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65   used, but since
29800 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72  .  ** n is never
29810 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61   more than NB (a
29820 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29   small constant)
29830 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20  , that should.  
29840 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ** not be a prob
29850 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  lem..  **.  ** W
29860 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20  hen NB==3, this 
29870 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  one optimization
29880 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62   makes the datab
29890 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32  ase.  ** about 2
298a0 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  5% faster for la
298b0 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61  rge insertions a
298c0 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20  nd deletions..  
298d0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
298e0 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  k-1; i++){.    i
298f0 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65  nt minV = pgnoNe
29900 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69  w[i];.    int mi
29910 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
29920 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
29930 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
29940 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64  New[j]<(unsigned
29950 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
29960 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
29970 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65     minV = pgnoNe
29980 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  w[j];.      }.  
29990 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
299a0 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
299b0 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
299c0 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
299d0 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
299e0 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
299f0 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
29a00 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49  ] = pgnoNew[minI
29a10 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
29a20 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
29a30 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d  .      pgnoNew[m
29a40 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20  inI] = t;.      
29a50 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
29a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
29a70 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
29a80 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65  ld: %d %d %d  ne
29a90 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
29aa0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
29ab0 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67  d(%d)\n",.    pg
29ac0 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e  noOld[0], .    n
29ad0 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=2 ? pgnoOld
29ae0 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  [1] : 0,.    nOl
29af0 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32  d>=3 ? pgnoOld[2
29b00 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e  ] : 0,.    pgnoN
29b10 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c  ew[0], szNew[0],
29b20 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70  .    nNew>=2 ? p
29b30 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e  gnoNew[1] : 0, n
29b40 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
29b50 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
29b60 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20  =3 ? pgnoNew[2] 
29b70 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
29b80 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
29b90 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e   nNew>=4 ? pgnoN
29ba0 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[3] : 0, nNew>
29bb0 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
29bc0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
29bd0 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c   pgnoNew[4] : 0,
29be0 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
29bf0 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a  [4] : 0));..  /*
29c00 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
29c10 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
29c20 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
29c30 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
29c40 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
29c50 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
29c60 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
29c70 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
29c80 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
29c90 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
29ca0 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
29cb0 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
29cc0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
29cd0 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
29ce0 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
29cf0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
29d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
29d10 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77  w->pgno==pgnoNew
29d20 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  [i] );.    zeroP
29d30 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
29d40 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
29d50 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
29d60 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
29d70 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
29d80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29d90 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
29da0 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
29db0 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
29dc0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
29dd0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
29de0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
29df0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
29e00 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
29e10 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
29e20 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  p entries.    **
29e30 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
29e40 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  he siblings that
29e50 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64   were rearranged
29e60 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20  . These can be: 
29e70 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c  left.    ** chil
29e80 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74  dren of cells, t
29e90 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
29ea0 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f  f the page, or o
29eb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20  verflow pages.  
29ec0 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
29ed0 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f  by cells..    */
29ee0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
29ef0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66  ACUUM ){.      f
29f00 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
29f10 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
29f20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
29f30 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
29f40 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
29f50 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
29f60 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
29f70 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
29f80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29f90 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
29fa0 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
29fb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29fc0 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63  OK && leafCorrec
29fd0 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tion==0 ){.     
29fe0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29ff0 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2a000 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20  yte(apCell[k]), 
2a010 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
2a020 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
2a030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a060 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2a070 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
2a080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2a0a0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
2a0b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2a0c0 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
2a0d0 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
2a0e0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
2a0f0 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
2a100 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
2a110 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
2a120 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
2a130 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c     */.    if( i<
2a140 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c  nNew-1 && j<nCel
2a150 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
2a160 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
2a170 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
2a180 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
2a190 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
2a1a0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
2a1b0 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
2a1c0 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
2a1d0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
2a1e0 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
2a1f0 20 26 61 53 70 61 63 65 32 5b 69 53 70 61 63 65   &aSpace2[iSpace
2a200 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  2];.      if( !p
2a210 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
2a220 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
2a230 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
2a240 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ll, 4);.        
2a250 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2a260 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 61   .         && (a
2a270 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c  From[j]==0xFF ||
2a280 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d   apCopy[aFrom[j]
2a290 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  ]->pgno!=pNew->p
2a2a0 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  gno).        ){.
2a2b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2a2c0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2a2d0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 50  t4byte(pCell), P
2a2e0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
2a2f0 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
2a300 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a320 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2a330 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2a340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a350 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2a360 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
2a370 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
2a380 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
2a390 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
2a3a0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
2a3b0 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
2a3c0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
2a3d0 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
2a3e0 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
2a3f0 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
2a400 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
2a410 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
2a420 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
2a430 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
2a440 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
2a450 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
2a460 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
2a470 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
2a480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a490 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2a4a0 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
2a4b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2a4c0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
2a4d0 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
2a4e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
2a4f0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
2a500 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28       fillInCell(
2a510 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20  pParent, pCell, 
2a520 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
2a530 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
2a540 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
2a550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a560 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
2a570 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
2a580 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
2a590 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
2a5a0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
2a5b0 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
2a5c0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
2a5d0 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
2a5e0 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
2a5f0 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
2a600 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
2a610 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
2a620 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
2a630 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
2a640 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
2a650 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
2a660 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
2a670 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
2a680 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
2a690 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
2a6a0 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
2a6b0 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
2a6c0 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
2a6d0 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
2a6e0 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
2a6f0 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
2a700 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
2a710 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
2a720 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
2a730 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
2a740 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
2a750 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
2a760 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
2a770 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
2a780 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
2a790 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
2a7a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
2a7b0 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
2a7c0 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
2a7d0 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
2a7e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a7f0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
2a800 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
2a810 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
2a820 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
2a830 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
2a840 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
2a850 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
2a860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a870 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20  Space2 += sz;.  
2a880 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2a890 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2a8a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a8b0 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70   iSpace2<=pBt->p
2a8c0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
2a8d0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2a8e0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2a8f0 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
2a900 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
2a910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a920 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2a930 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
2a940 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2a950 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2a960 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2a970 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2a980 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2a990 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
2a9a0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a  , pNew->pgno);..
2a9b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2a9c0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2a9d0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
2a9e0 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
2a9f0 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
2aa00 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
2aa10 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
2aa20 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2aa30 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
2aa40 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
2aa50 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
2aa60 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
2aa70 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
2aa80 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
2aa90 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61  TOVACUUM && !lea
2aaa0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2aab0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
2aac0 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
2aad0 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
2aae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2aaf0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2ab00 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2ab10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ab20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20    }.      j++;. 
2ab30 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
2ab40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
2ab50 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2ab60 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
2ab70 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2ab80 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2ab90 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2aba0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2abb0 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  pBt, pNew->pgno,
2abc0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2abd0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2abe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2abf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ac00 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2ac10 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
2ac20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2ac30 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
2ac40 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
2ac50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
2ac60 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
2ac70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
2ac80 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
2ac90 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
2aca0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
2acb0 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
2acc0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
2acd0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
2ace0 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  ld, 4);.    if( 
2acf0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2ad00 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2ad10 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2ad20 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d  te(zChild), PTRM
2ad30 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
2ad40 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
2ad50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ad60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ad70 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2ad80 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2ad90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2ada0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2adb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2adc0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2add0 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  ;.  if( nxDiv==p
2ade0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
2adf0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2ae00 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
2ae10 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2ae20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2ae30 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2ae40 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2ae50 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2ae60 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2ae70 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
2ae80 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
2ae90 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
2aea0 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
2aeb0 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
2aec0 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
2aed0 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
2aee0 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
2aef0 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
2af00 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
2af10 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2af20 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
2af30 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
2af40 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
2af50 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
2af60 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2af70 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2af80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
2af90 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
2afa0 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2afb0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2afc0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
2afd0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
2afe0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
2aff0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2b000 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
2b010 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2b020 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2b030 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
2b040 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2b050 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70  ee(apCell);.  ap
2b060 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Cell = 0;.  rele
2b070 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2b080 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
2b090 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
2b0a0 70 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  pCur, 0);.  .  /
2b0b0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
2b0c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b0d0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
2b0e0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
2b0f0 50 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32  PageFree(aSpace2
2b100 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  );.  sqlite3Scra
2b110 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
2b120 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2b130 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
2b140 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
2b150 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
2b160 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
2b170 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2b180 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
2b190 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
2b1a0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 72  low = 0;..  /* r
2b1b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65  eleasePage(pPare
2b1c0 6e 74 29 3b 20 2a 2f 0a 20 20 54 52 41 43 45 28  nt); */.  TRACE(
2b1d0 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
2b1e0 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
2b1f0 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
2b200 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2b210 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
2b220 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
2b230 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
2b240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2b250 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2b260 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
2b270 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
2b280 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
2b290 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
2b2a0 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
2b2b0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
2b2c0 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
2b2d0 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
2b2e0 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
2b2f0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2b300 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74 43 75  e_shallower(BtCu
2b310 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2b320 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
2b330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b340 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d 54 72  oot page of B-Tr
2b350 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2b360 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  *pChild;        
2b370 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
2b380 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70   child page of p
2b390 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Page */.  Pgno p
2b3a0 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20  gnoChild;       
2b3b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2b3c0 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64  umber for pChild
2b3d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2b3e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2b3f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b400 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
2b410 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72  ures */.  BtShar
2b420 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2b430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b440 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72 75   main BTree stru
2b450 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  cture */.  int m
2b460 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20  xCellPerPage;   
2b470 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2b480 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  um number of cel
2b490 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20  ls per page */. 
2b4a0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20   u8 **apCell;   
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b4c0 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20   All cells from 
2b4d0 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
2b4e0 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
2b4f0 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
2b500 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
2b510 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
2b520 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
2b530 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2b540 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2b550 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20  ->apPage[0];..  
2b560 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2b570 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2b580 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2b590 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2b5a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2b5b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2b5c0 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
2b5d0 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
2b5e0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
2b5f0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65  ite3Malloc( mxCe
2b600 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
2b610 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
2b620 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
2b630 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2b640 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b650 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2b660 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
2b670 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
2b680 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b690 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
2b6a0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2b6b0 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
2b6c0 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
2b6d0 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
2b6e0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
2b6f0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
2b700 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2b710 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
2b720 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
2b730 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
2b740 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
2b750 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
2b760 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
2b770 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
2b780 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
2b790 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
2b7a0 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
2b7b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2b7c0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2b7d0 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
2b7e0 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
2b7f0 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
2b800 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
2b810 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
2b820 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
2b830 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
2b840 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
2b850 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
2b860 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
2b870 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
2b880 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
2b890 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2b8a0 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
2b8b0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
2b8c0 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
2b8d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
2b8e0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
2b8f0 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
2b900 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
2b910 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
2b920 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
2b930 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
2b940 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
2b950 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
2b960 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
2b970 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
2b980 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
2b990 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
2b9a0 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
2b9b0 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43  = 1 );.    pgnoC
2b9c0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2b9d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2b9e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2b9f0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2ba00 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20  pgnoChild>0 );. 
2ba10 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2ba20 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63  hild<=pagerPagec
2ba30 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 29  ount(pPage->pBt)
2ba40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2ba50 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2ba60 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
2ba70 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c  oChild, &pChild,
2ba80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2ba90 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
2baa0 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2bab0 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  if( pPage->pgno=
2bac0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
2bad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2bae0 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  tPage(pChild);. 
2baf0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2bb00 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2bb10 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73  alance;.      as
2bb20 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f  sert( pChild->nO
2bb30 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2bb40 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
2bb50 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20  nFree>=100 ){.  
2bb60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2bb70 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ld information w
2bb80 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
2bb90 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20  oot page, so do 
2bba0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
2bbb0 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  opy */.        i
2bbc0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65  nt i;.        ze
2bbd0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
2bbe0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  hild->aData[0]);
2bbf0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2bc00 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
2bc10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
2bc20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66     apCell[i] = f
2bc30 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69  indCell(pChild,i
2bc40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  );.          szC
2bc50 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  ell[i] = cellSiz
2bc60 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43  ePtr(pChild, apC
2bc70 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ell[i]);.       
2bc80 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d   }.        assem
2bc90 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70  blePage(pPage, p
2bca0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70  Child->nCell, ap
2bcb0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20  Cell, szCell);. 
2bcc0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
2bcd0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
2bce0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f   of the child to
2bcf0 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
2bd00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bd10 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2bd20 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2bd30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2bd40 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2bd50 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2bd60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a  >hdrOffset+8], .
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
2bd80 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44  byte(&pChild->aD
2bd90 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f  ata[pChild->hdrO
2bda0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2bdb0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2bdc0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2bdd0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2bde0 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61  CE: child %d tra
2bdf0 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c  nsfer to page 1\
2be00 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
2be10 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2be20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2be30 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
2be40 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
2be50 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2be60 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  root..        **
2be70 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72   The tree is alr
2be80 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20  eady balanced.  
2be90 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  Do nothing. */. 
2bea0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
2beb0 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2bec0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
2bed0 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
2bee0 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
2bef0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2bf00 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
2bf10 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64  e->aData, pChild
2bf20 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  ->aData, pPage->
2bf30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
2bf40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  ;.      pPage->i
2bf50 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
2bf60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2bf70 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
2bf80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bf90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bfa0 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
2bfb0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2bfc0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2bfd0 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
2bfe0 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
2bff0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2c000 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
2c010 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2c020 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2c030 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c040 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  w==0 );.#ifndef 
2c050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2c060 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 49  VACUUM.    if( I
2c070 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 72  SAUTOVACUUM && r
2c080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c090 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43 68        rc = setCh
2c0a0 69 6c 64 50 74 72 6d 61 70 73 28 70 50 61 67 65  ildPtrmaps(pPage
2c0b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2c0c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c0d0 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64  pChild);.  }.end
2c0e0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2c0f0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2c100 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
2c110 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2c120 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
2c130 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
2c140 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
2c150 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
2c160 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
2c170 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
2c180 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
2c190 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
2c1a0 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
2c1b0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
2c1c0 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
2c1d0 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
2c1e0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
2c1f0 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
2c200 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
2c210 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
2c220 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
2c230 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
2c240 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
2c250 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
2c260 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  er(BtCursor *pCu
2c270 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
2c280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2c290 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
2c2a0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2c2b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c2c0 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
2c2d0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
2c2e0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2c2f0 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
2c300 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
2c310 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
2c320 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2c330 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2c340 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
2c350 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
2c360 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2c370 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
2c380 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
2c390 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
2c3a0 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
2c3b0 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
2c3c0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2c3d0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2c3e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2c3f0 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
2c400 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2c410 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
2c420 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
2c430 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
2c440 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
2c450 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
2c460 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  t */.  int cbrk;
2c470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2c480 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
2c490 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
2c4a0 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
2c4b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2c4c0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
2c4d0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2c4e0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  ]->nOverflow>0 )
2c4f0 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70  ;..  VVA_ONLY( p
2c500 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
2c510 65 64 20 3d 20 31 20 29 3b 0a 20 20 70 50 61 67  ed = 1 );.  pPag
2c520 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2c530 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  [0];.  pBt = pPa
2c540 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
2c550 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c560 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2c570 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c580 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2c590 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2c5a0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 63 20 3d  bPage) );.  rc =
2c5b0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c5c0 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c  ge(pBt, &pChild,
2c5d0 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61   &pgnoChild, pPa
2c5e0 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  ge->pgno, 0);.  
2c5f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2c600 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
2c610 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c620 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
2c630 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62  bPage) );.  usab
2c640 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
2c650 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
2c660 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2c670 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2c680 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72  hdrOffset;.  cbr
2c690 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
2c6a0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
2c6b0 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
2c6c0 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
2c6d0 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
2c6e0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2c6f0 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
2c700 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
2c710 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  (&cdata[cbrk], &
2c720 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62  data[cbrk], usab
2c730 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20  leSize-cbrk);.. 
2c740 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2c750 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
2c760 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c770 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
2c780 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2c790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2c7a0 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67 65 2d  t nCopy = pPage-
2c7b0 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
2c7c0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2c7d0 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ]);.    memcpy(p
2c7e0 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50  Child->aOvfl, pP
2c7f0 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70  age->aOvfl, nCop
2c800 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e  y);.    pChild->
2c810 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2c820 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2c830 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f    if( pChild->nO
2c840 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
2c850 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
2c860 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   0;.    }.    as
2c870 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
2c880 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ell==pPage->nCel
2c890 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
2c8a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c8b0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c8c0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2c8d0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2c8e0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
2c8f0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
2c900 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2c910 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c920 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2c930 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 54  gnoChild);.    T
2c940 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2c950 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2c960 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2c970 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2c980 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49 53  no));.    if( IS
2c990 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2c9a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2c9b0 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e  ut(pBt, pChild->
2c9c0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2c9d0 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  EE, pPage->pgno)
2c9e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2c9f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2ca00 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2ca10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ca20 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2ca30 64 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64 29  dPtrmaps(pChild)
2ca40 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2ca50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2ca60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ca70 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  ){.    pCur->iPa
2ca80 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ge++;.    pCur->
2ca90 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69  apPage[1] = pChi
2caa0 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ld;.    pCur->ai
2cab0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
2cac0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
2cad0 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  root(pCur);.  }e
2cae0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
2caf0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2cb00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2cb10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
2cb20 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72  e that pCur curr
2cb30 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
2cb40 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f  has just been mo
2cb50 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d  dified in.** som
2cb60 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63  e way. This func
2cb70 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74  tion figures out
2cb80 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63   if this modific
2cb90 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a  ation means the.
2cba0 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  ** tree needs to
2cbb0 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e   be balanced, an
2cbc0 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68  d if so calls th
2cbd0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2cbe0 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74  lancing .** rout
2cbf0 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61  ine..** .** Para
2cc00 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74 20 69  meter isInsert i
2cc10 73 20 74 72 75 65 20 69 66 20 61 20 6e 65 77 20  s true if a new 
2cc20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e  cell was just in
2cc30 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a  serted into the.
2cc40 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73  ** page, or fals
2cc50 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
2cc60 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2cc70 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
2cc80 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29  r, int isInsert)
2cc90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2cca0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2ccb0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2ccc0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ccd0 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  age];..  assert(
2cce0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ccf0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2cd00 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2cd10 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2cd20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2cd30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2cd40 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2cd50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cd60 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f  _OK && pPage->nO
2cd70 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
2cd80 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2cd90 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20  deeper(pCur);.  
2cda0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cdb0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2cdc0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
2cdd0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
2cde0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cdf0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  && pPage->nCell=
2ce00 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2ce10 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2ce20 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  er(pCur);.      
2ce30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ce40 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72  Overflow==0 || r
2ce50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2ce60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2ce70 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
2ce80 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
2ce90 20 20 20 20 20 20 28 21 69 73 49 6e 73 65 72 74        (!isInsert
2cea0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
2ceb0 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
2cec0 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a  bleSize*2/3) ){.
2ced0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2cee0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29  ce_nonroot(pCur)
2cef0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cf00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2cf10 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ==0 || rc!=SQLIT
2cf20 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20  E_OK );.    }.  
2cf30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cf40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2cf50 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20  tine checks all 
2cf60 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69  cursors that poi
2cf70 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f  nt to table pgno
2cf80 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  Root..** If any 
2cf90 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73  of those cursors
2cfa0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74   were opened wit
2cfb0 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61  h wrFlag==0 in a
2cfc0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61   different.** da
2cfd0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2cfe0 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f  n (a database co
2cff0 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nnection that sh
2d000 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a  ares the pager.*
2d010 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65  * cache with the
2d020 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74   current connect
2d030 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74  ion) and that ot
2d040 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  her connection .
2d050 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ** is not in the
2d060 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65   ReadUncommmitte
2d070 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  d state, then th
2d080 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2d090 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f  ns .** SQLITE_LO
2d0a0 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77  CKED..**.** As w
2d0b0 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77  ell as cursors w
2d0c0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63  ith wrFlag==0, c
2d0d0 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c  ursors with wrFl
2d0e0 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73  ag==1 and .** is
2d0f0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d  IncrblobHandle==
2d100 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69  1 are also consi
2d110 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72  dered 'read' cur
2d120 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61  sors. Incrementa
2d130 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f  l .** blob curso
2d140 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
2d150 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
2d160 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
2d170 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73  When pgnoRoot is
2d180 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2d190 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  f an intkey tabl
2d1a0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
2d1b0 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70   is also.** resp
2d1c0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61  onsible for inva
2d1d0 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65  lidating increme
2d1e0 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2d1f0 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  s when the table
2d200 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68   row.** on which
2d210 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64   they are opened
2d220 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d   is deleted or m
2d230 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73  odified. Cursors
2d240 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2d250 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  .** according to
2d260 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
2d270 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ules:.**.**   1)
2d280 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72   When BtreeClear
2d290 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  Table() is calle
2d2a0 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d to completely 
2d2b0 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65  delete the conte
2d2c0 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61  nts.**      of a
2d2d0 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70   B-Tree table, p
2d2e0 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2d2f0 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d  o zero and param
2d300 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a  eter iRow is .**
2d310 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e        set to non
2d320 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63  -zero. In this c
2d330 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e  ase all incremen
2d340 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
2d350 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e   open.**      on
2d360 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2d370 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72  d at pgnoRoot ar
2d380 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2d390 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42  *.**   2) When B
2d3a0 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74  treeInsert(), Bt
2d3b0 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
2d3c0 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69 73  treePutData() is
2d3d0 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20   called to .**  
2d3e0 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62      modify a tab
2d3f0 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51  le row via an SQ
2d400 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78  L statement, pEx
2d410 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
2d420 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69  the .**      wri
2d430 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74  te cursor used t
2d440 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63  o do the modific
2d450 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65  ation and parame
2d460 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a  ter iRow is set.
2d470 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  **      to the i
2d480 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66  nteger row id of
2d490 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72   the B-Tree entr
2d4a0 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  y being modified
2d4b0 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20  . Unless.**     
2d4c0 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74 73   pExclude is its
2d4d0 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  elf an increment
2d4e0 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20  al blob cursor, 
2d4f0 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65  then all increme
2d500 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f  ntal.**      blo
2d510 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
2d520 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68  n row iRow of th
2d530 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76  e B-Tree are inv
2d540 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  alidated..**.** 
2d550 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45 78    3) If both pEx
2d560 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61  clude and iRow a
2d570 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20  re set to zero, 
2d580 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  no incremental b
2d590 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  lob .**      cur
2d5a0 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
2d5b0 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
2d5c0 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  int checkReadLoc
2d5d0 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ks(.  Btree *pBt
2d5e0 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e  ree, .  Pgno pgn
2d5f0 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73  oRoot, .  BtCurs
2d600 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20  or *pExclude,.  
2d610 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74  i64 iRow.){.  Bt
2d620 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
2d630 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
2d640 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
2d650 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
2d660 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
2d670 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2d680 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
2d690 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2d6a0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
2d6b0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
2d6c0 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f  p==pExclude ) co
2d6d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2d6e0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e  p->pgnoRoot!=pgn
2d6f0 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65  oRoot ) continue
2d700 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2d710 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2d720 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72     if( p->isIncr
2d730 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20  blobHandle && ( 
2d740 0a 20 20 20 20 20 20 20 20 20 28 21 70 45 78 63  .         (!pExc
2d750 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20  lude && iRow).  
2d760 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65      || (pExclude
2d770 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69   && !pExclude->i
2d780 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
2d790 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  && p->info.nKey=
2d7a0 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20  =iRow).    )){. 
2d7b0 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
2d7c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2d7d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2d7e0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21    if( p->eState!
2d7f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2d800 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2d810 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a  ( p->wrFlag==0 .
2d820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d830 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2d840 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c    || p->isIncrbl
2d850 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a  obHandle.#endif.
2d860 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
2d870 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2d880 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  p->pBtree->db;. 
2d890 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
2d8a0 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
2d8b0 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20  (dbOther!=db && 
2d8c0 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
2d8d0 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
2d8e0 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b  ommitted)==0) ){
2d8f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d900 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2d910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d920 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d930 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
2d940 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
2d950 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
2d960 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
2d970 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
2d980 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
2d990 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
2d9a0 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
2d9b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
2d9c0 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
2d9d0 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
2d9e0 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
2d9f0 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
2da00 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
2da10 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
2da20 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
2da30 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
2da40 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
2da50 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
2da60 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
2da70 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
2da80 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
2da90 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
2daa0 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
2dab0 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
2dac0 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  both ignored..*/
2dad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2dae0 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
2daf0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2db00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2db10 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
2db20 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
2db30 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
2db40 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
2db50 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
2db60 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
2db70 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
2db80 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
2db90 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
2dba0 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
2dbb0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
2dbc0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dbe0 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
2dbf0 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
2dc00 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
2dc10 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20  int appendBias  
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dc30 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2dc40 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
2dc50 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nd */.){.  int r
2dc60 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20  c;.  int loc;.  
2dc70 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74  int szNew;.  int
2dc80 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2dc90 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
2dca0 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
2dcb0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
2dcc0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
2dcd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
2dce0 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
2dcf0 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
2dd00 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
2dd10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2dd20 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
2dd30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2dd40 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2dd50 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2dd60 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2dd70 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2dd80 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
2dd90 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2dda0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2ddb0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2ddc0 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2ddd0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2dde0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2ddf0 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72  y );.  if( !pCur
2de00 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2de10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2de20 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  RM;   /* Cursor 
2de30 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69  not open for wri
2de40 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2de50 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2de60 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2de70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2de80 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20  Cur, nKey) ){.  
2de90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dea0 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74  LOCKED; /* The t
2deb0 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73  able pCur points
2dec0 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c   to has a read l
2ded0 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ock */.  }.  if(
2dee0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2def0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
2df00 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
2df10 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  skip;.  }..  /* 
2df20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
2df30 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2df40 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2df50 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2df60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2df70 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2df80 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45   if( .    SQLITE
2df90 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2dfa0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2dfb0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2dfc0 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c  Cur)) ||.    SQL
2dfd0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
2dfe0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2dff0 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65  (pCur, pKey, nKe
2e000 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
2e010 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
2e020 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e030 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e040 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e050 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2e060 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e  age->intKey || n
2e070 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
2e080 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2e090 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
2e0a0 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49  y );.  TRACE(("I
2e0b0 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
2e0c0 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
2e0d0 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
2e0e0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
2e0f0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
2e100 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
2e110 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
2e120 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
2e130 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
2e140 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
2e150 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2e160 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  .  allocateTempS
2e170 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77  pace(pBt);.  new
2e180 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
2e190 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77  Space;.  if( new
2e1a0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2e1b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2e1c0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
2e1d0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
2e1e0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
2e1f0 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f  ta, nData, nZero
2e200 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
2e210 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
2e220 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
2e230 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
2e240 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
2e250 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
2e260 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
2e270 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
2e280 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
2e290 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e2a0 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43   if( loc==0 && C
2e2b0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2e2c0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2e2d0 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
2e2e0 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67  assert( idx<pPag
2e2f0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2e300 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e310 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2e320 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2e330 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
2e340 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2e350 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
2e360 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2e370 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21   idx);.    if( !
2e380 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e390 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
2e3a0 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
2e3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
2e3c0 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
2e3d0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
2e3e0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2e3f0 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
2e400 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2e410 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2e420 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  t;.    rc = drop
2e430 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
2e440 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28   szOld);.    if(
2e450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e460 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   {.      goto en
2e470 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
2e480 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
2e490 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
2e4a0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
2e4b0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2e4c0 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43  ;.    idx = ++pC
2e4d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e4e0 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43 75 72  iPage];.    pCur
2e4f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2e500 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
2e510 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  dNKey = 0;.  }el
2e520 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2e530 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
2e540 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
2e550 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
2e560 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
2e570 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2e580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e590 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2e5a0 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  pCur, 1);.  }.. 
2e5b0 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
2e5c0 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
2e5d0 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
2e5e0 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
2e5f0 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73 2e 20  e().  ** fails. 
2e600 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   Internal data s
2e610 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
2e620 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ion will result 
2e630 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20  otherwise. */.  
2e640 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2e650 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72  Overflow==0 || r
2e660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2e670 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
2e680 6f 77 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  ow = 0;..  if( r
2e690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e6a0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2e6b0 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e  Cur);.  }.end_in
2e6c0 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
2e6d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2e6e0 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
2e6f0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2e700 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
2e710 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2e720 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2e730 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
2e740 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2e750 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2e760 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2e770 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2e780 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2e790 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e7a0 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73 69   int idx;.  unsi
2e7b0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2e7c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
2e7d0 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
2e7e0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
2e7f0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
2e800 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e810 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2e820 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2e830 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2e840 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e850 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74  nit );.  if( pBt
2e860 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2e870 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2e880 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2e890 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2e8a0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64  before doing a d
2e8b0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20  elete */.    rc 
2e8c0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2e8d0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2e8e0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2e8f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2e900 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2e910 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2e920 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2e930 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2e940 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2e950 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2e960 20 20 69 66 28 20 70 43 75 72 2d 3e 61 69 49 64    if( pCur->aiId
2e970 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
2e980 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2e990 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e9a0 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65  E_ERROR;  /* The
2e9b0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2e9c0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68  ointing to anyth
2e9d0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2e9e0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2e9f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ea00 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44  ITE_PERM;   /* D
2ea10 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73  id not open this
2ea20 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74   cursor for writ
2ea30 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2ea40 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2ea50 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2ea60 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2ea70 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ur, pCur->info.n
2ea80 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Key) ){.    retu
2ea90 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2eaa0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2eab0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2eac0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2ead0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2eae0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2eaf0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2eb00 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2eb10 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2eb20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2eb30 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2eb40 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2eb50 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2eb60 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2eb70 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2eb80 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2eb90 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2eba0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2ebb0 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2ebc0 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2ebd0 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2ebe0 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2ebf0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2ec00 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29  rPosition(pCur))
2ec10 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2ec20 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2ec30 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2ec40 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c  oot, pCur))!=0 |
2ec50 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69  |.    (rc = sqli
2ec60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2ec70 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
2ec80 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
2ec90 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
2eca0 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20  Locate the cell 
2ecb0 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65 20  within its page 
2ecc0 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20  and leave pCell 
2ecd0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a  pointing to the.
2ece0 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63    ** data. The c
2ecf0 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20  learCell() call 
2ed00 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c  frees any overfl
2ed10 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2ed20 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
2ed30 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c  * cell. The cell
2ed40 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c   itself is still
2ed50 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20   intact..  */.  
2ed60 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2ed70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2ed80 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2ed90 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
2eda0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2edb0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68  af ){.    pgnoCh
2edc0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70  ild = get4byte(p
2edd0 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20  Cell);.  }.  rc 
2ede0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
2edf0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28  e, pCell);.  if(
2ee00 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
2ee10 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
2ee20 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2ee30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
2ee40 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20  he entry we are 
2ee50 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20  about to delete 
2ee60 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f  is not a leaf so
2ee70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20   if we do not.  
2ee80 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e    ** do somethin
2ee90 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  g we will leave 
2eea0 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74  a hole on an int
2eeb0 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20  ernal page..    
2eec0 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69  ** We have to fi
2eed0 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d  ll the hole by m
2eee0 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20  oving in a cell 
2eef0 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68  from a leaf.  Th
2ef00 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65  e.    ** next Ce
2ef10 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65  ll after the one
2ef20 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
2ef30 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2ef40 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a  exist and.    **
2ef50 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f   to be a leaf so
2ef60 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a   we can use it..
2ef70 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72      */.    BtCur
2ef80 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20  sor leafCur;.   
2ef90 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 50   MemPage *pLeafP
2efa0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75 6e  age = 0;..    un
2efb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
2efc0 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  xt;.    int notU
2efd0 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  sed;.    unsigne
2efe0 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c  d char *tempCell
2eff0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2f000 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
2f010 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
2f020 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
2f030 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72  r(pCur, &leafCur
2f040 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2f050 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65  te3BtreeNext(&le
2f060 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  afCur, &notUsed)
2f070 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f090 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72   assert( leafCur
2f0a0 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69  .aiIdx[leafCur.i
2f0b0 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Page]==0 );.    
2f0c0 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65    pLeafPage = le
2f0d0 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61  afCur.apPage[lea
2f0e0 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20  fCur.iPage];.   
2f0f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f100 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50  agerWrite(pLeafP
2f110 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2f120 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2f130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f140 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72 73      int leafCurs
2f150 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a 20  orInvalid = 0;. 
2f160 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b       u16 szNext;
2f170 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2f180 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2f190 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2f1a0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2f1b0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2f1c0 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2f1d0 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2f1e0 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67 65  >pgno, pLeafPage
2f1f0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2f200 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2f210 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
2f220 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
2f230 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66  .      pNext = f
2f240 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61 67  indCell(pLeafPag
2f250 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a 4e  e, 0);.      szN
2f260 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2f270 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e 65  r(pLeafPage, pNe
2f280 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xt);.      asser
2f290 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
2f2a0 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29  pBt)>=szNext+4 )
2f2b0 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65  ;.      allocate
2f2c0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
2f2d0 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
2f2e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2f2f0 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43  .      if( tempC
2f300 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2f310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2f320 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2f330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f350 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2f360 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65 78  pPage, idx, pNex
2f370 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74  t-4, szNext+4, t
2f380 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20  empCell, 0);.   
2f390 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20     }...      /* 
2f3a0 54 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65  The "if" stateme
2f3b0 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20 63  nt in the next c
2f3c0 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72 69  ode block is cri
2f3d0 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
2f3e0 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20 65    ** slightest e
2f3f0 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74 61  rror in that sta
2f400 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c 6c  tement would all
2f410 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70 65  ow SQLite to ope
2f420 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  rate.      ** co
2f430 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66 20  rrectly most of 
2f440 74 68 65 20 74 69 6d 65 20 62 75 74 20 70 72 6f  the time but pro
2f450 64 75 63 65 20 76 65 72 79 20 72 61 72 65 20 66  duce very rare f
2f460 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20 20  ailures.  To.   
2f470 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61 69     ** guard agai
2f480 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20 66 6f  nst this, the fo
2f490 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 68  llowing macros h
2f4a0 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74 68  elp to verify th
2f4b0 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  at.      ** the 
2f4c0 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69  "if" statement i
2f4d0 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a 20  s well tested.. 
2f4e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65       */.      te
2f4f0 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
2f500 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
2f510 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74 2d  Page->nFree<pBt-
2f520 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
2f530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f540 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
2f550 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
2f560 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2f570 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65  *2/3 );.      te
2f580 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
2f590 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
2f5a0 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74  Page->nFree==pBt
2f5b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2f5c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2f5d0 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
2f5e0 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
2f5f0 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
2f600 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74  e*2/3 );.      t
2f610 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
2f620 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
2f630 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42  pPage->nFree==pB
2f640 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2f650 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20 20  3+1 .           
2f660 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
2f670 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2f680 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
2f690 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
2f6a0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2f6b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 26  e->nOverflow>0 &
2f6c0 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d  & pPage->nFree<=
2f6d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2f6e0 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20 20  2/3.            
2f6f0 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
2f700 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
2f710 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
2f720 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
2f730 20 74 65 73 74 63 61 73 65 28 20 28 70 50 61 67   testcase( (pPag
2f740 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
2f750 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  | (pPage->nFree 
2f760 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
2f770 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20 20  e*2/3)).        
2f780 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
2f790 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
2f7a0 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75 73  zNext == pBt->us
2f7b0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
2f7c0 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 61  ..      if( (pPa
2f7d0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2f7e0 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65  || (pPage->nFree
2f7f0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
2f800 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20 20  ze*2/3)) &&.    
2f810 20 20 20 20 20 20 28 70 4c 65 61 66 50 61 67 65        (pLeafPage
2f820 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
2f830 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
2f840 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29 7b  ze*2/3).      ){
2f850 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2f860 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2f870 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
2f880 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69 74   node is now eit
2f890 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67 0a  her overflowing.
2f8a0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75 6e          ** or un
2f8b0 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65 20  derfull and the 
2f8c0 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20 62  leaf node will b
2f8d0 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74 65  e underfull afte
2f8e0 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c 20  r the just cell 
2f8f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69  .        ** copi
2f900 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
2f910 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65 74  al node is delet
2f920 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69 73  ed from it. This
2f930 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20   is a special.  
2f940 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62 65        ** case be
2f950 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
2f960 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20 63  o balance() to c
2f970 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74 65 72  orrect the inter
2f980 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20 20  nal node.       
2f990 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20 74   ** may change t
2f9a0 68 65 20 74 72 65 65 20 73 74 72 75 63 74 75 72  he tree structur
2f9b0 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
2f9c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2f9d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f9e0 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d  leafCur.apPage[]
2f9f0 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49   and leafCur.aiI
2fa00 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68 69  dx[] arrays, whi
2fa10 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  ch will be.     
2fa20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
2fa30 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71 75  e balance() requ
2fa40 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74 20  ired to correct 
2fa50 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c 65  the underfull le
2fa60 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  af.        ** no
2fa70 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  de..        **. 
2fa80 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66 6f         ** The fo
2fa90 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74 68  rmula used in th
2faa0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62 6f  e expression abo
2fab0 76 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ve are based on 
2fac0 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20 20  facets of.      
2fad0 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
2fae0 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61 74  file-format that
2faf0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f   do not change o
2fb00 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ver time..      
2fb10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73    */.        tes
2fb20 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 46  tcase( pPage->nF
2fb30 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree==pBt->usable
2fb40 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20  Size*2/3+1 );.  
2fb50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fb60 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
2fb70 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e  +2+szNext==pBt->
2fb80 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31  usableSize*2/3+1
2fb90 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61 66   );.        leaf
2fba0 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20  CursorInvalid = 
2fbb0 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20 20  1;.      }      
2fbc0 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63    ..      if( rc
2fbd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fbe0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2fbf0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2fc00 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2fc10 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2fc20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2fc30 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
2fc40 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68 69  e, idx), pgnoChi
2fc50 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41  ld);.        VVA
2fc60 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
2fc70 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29  esShuffled = 0 )
2fc80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
2fc90 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
2fca0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2fcb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fcc0 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f 72 49  K && leafCursorI
2fcd0 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  nvalid ){.      
2fce0 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e 6f    /* The leaf-no
2fcf0 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65 72 66  de is now underf
2fd00 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65 20 74  ull and so the t
2fd10 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
2fd20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 62 61  .        ** reba
2fd30 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65 72 2c  lanced. However,
2fd40 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 6f   the balance() o
2fd50 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20  peration on the 
2fd60 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 20  internal.       
2fd70 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20 6d   ** node above m
2fd80 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65 64  ay have modified
2fd90 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f   the structure o
2fda0 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 6e 64  f the B-Tree and
2fdb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  .        ** so t
2fdc0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
2fdd0 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72 2e 61  nts of leafCur.a
2fde0 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66  pPage[] and leaf
2fdf0 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20 20  Cur.aiIdx[].    
2fe00 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
2fe10 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20 20 20  e trusted..     
2fe20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2fe30 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
2fe40 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68 65 20  ble to copy the 
2fe50 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20 70 43  ancestry from pC
2fe60 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d 65 0a  ur, as the same.
2fe70 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
2fe80 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20 69 6e  ce() call has in
2fe90 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 70 43  validated the pC
2fea0 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e 64  ur->apPage[] and
2feb0 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20   aiIdx[].       
2fec0 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20 20 20   ** arrays. .   
2fed0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2fee0 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
2fef0 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
2ff00 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65 72 6e  n() below intern
2ff10 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65 20 0a  ally saves the .
2ff20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 74          ** key t
2ff30 68 61 74 20 6c 65 61 66 43 75 72 20 69 73 20 63  hat leafCur is c
2ff40 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2ff50 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79 2c  g to. Currently,
2ff60 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   there.        *
2ff70 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69 65 73  * are two copies
2ff80 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69 6e 20   of that key in 
2ff90 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65 20 68  the tree - one h
2ffa0 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61 66 0a  ere on the leaf.
2ffb0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2ffc0 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20  and one on some 
2ffd0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e  internal node in
2ffe0 20 74 68 65 20 74 72 65 65 2e 20 54 68 65 20 63   the tree. The c
2fff0 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  opy on.        *
30000 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  * the leaf node 
30010 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e 65  is always the ne
30020 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65 2d 6f  xt key in tree-o
30030 72 64 65 72 20 61 66 74 65 72 20 74 68 65 20 0a  rder after the .
30040 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20          ** copy 
30050 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  on the internal 
30060 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20 63 61  node. So, the ca
30070 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
30080 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20 20 20  eeNext().       
30090 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f 72   ** calls restor
300a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
300b0 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20 63  ) to point the c
300c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63 6f 70  ursor to the cop
300d0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  y.        ** sto
300e0 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  red on the inter
300f0 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20 61  nal node, then a
30100 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65 20 6e  dvances to the n
30110 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20 20 20  ext entry,.     
30120 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61 70 70     ** which happ
30130 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 63 6f  ens to be the co
30140 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 6e  py of the key on
30150 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
30160 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e  de..        ** N
30170 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61 66 43  et effect: leafC
30180 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 62  ur is pointing b
30190 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70 6c 69  ack to the dupli
301a0 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20 20 20  cate cell.      
301b0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73 20    ** that needs 
301c0 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 61  to be removed, a
301d0 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61  nd the leafCur.a
301e0 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20 20  pPage[] and.    
301f0 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e 61      ** leafCur.a
30200 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20 61 72  iIdx[] arrays ar
30210 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 20  e correct..     
30220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 56     */.        VV
30230 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65 61  A_ONLY( Pgno lea
30240 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61 67  fPgno = pLeafPag
30250 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20 20  e->pgno );.     
30260 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
30270 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61 66  orPosition(&leaf
30280 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Cur);.        if
30290 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
302a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
302b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
302c0 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f  xt(&leafCur, &no
302d0 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20  tUsed);.        
302e0 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 50  }.        pLeafP
302f0 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70  age = leafCur.ap
30300 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61  Page[leafCur.iPa
30310 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ge];.        ass
30320 65 72 74 28 20 70 4c 65 61 66 50 61 67 65 2d 3e  ert( pLeafPage->
30330 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20 29  pgno==leafPgno )
30340 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30350 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b  ( leafCur.aiIdx[
30360 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d  leafCur.iPage]==
30370 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  0 );.      }..  
30380 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
30390 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20 26 26 20  K==rc.       && 
303a0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
303b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
303c0 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44  te(pLeafPage->pD
303d0 62 50 61 67 65 29 29 20 0a 20 20 20 20 20 20 29  bPage)) .      )
303e0 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  {.        dropCe
303f0 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30 2c  ll(pLeafPage, 0,
30400 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
30410 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66    VVA_ONLY( leaf
30420 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65  Cur.pagesShuffle
30430 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20  d = 0 );.       
30440 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c   rc = balance(&l
30450 65 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  eafCur, 0);.    
30460 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
30470 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c 7c  CursorInvalid ||
30480 20 21 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53   !leafCur.pagesS
30490 68 75 66 66 6c 65 64 0a 20 20 20 20 20 20 20 20  huffled.        
304a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 70             || !p
304c0 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
304d0 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
304e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
304f0 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
30500 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
30510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
30520 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
30530 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
30540 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
30550 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
30560 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
30570 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 72  o));.    rc = dr
30580 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
30590 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
305a0 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
305b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
305c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
305d0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
305e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
305f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30600 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
30610 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
30620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30630 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
30640 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20  ew BTree table. 
30650 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54   Write into *piT
30660 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a  able the page.**
30670 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
30680 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
30690 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   new table..**.*
306a0 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79  * The type of ty
306b0 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  pe is determined
306c0 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61   by the flags pa
306d0 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74  rameter.  Only t
306e0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
306f0 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20  values of flags 
30700 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
30710 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c   use.  Other val
30720 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73  ues for.** flags
30730 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a   might not work:
30740 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  .**.**     BTREE
30750 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45  _INTKEY|BTREE_LE
30760 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20  AFDATA     Used 
30770 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77  for SQL tables w
30780 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a  ith rowid keys.*
30790 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f  *     BTREE_ZERO
307a0 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20  DATA            
307b0 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53        Used for S
307c0 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74  QL indices.*/.st
307d0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72  atic int btreeCr
307e0 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
307f0 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
30800 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
30810 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
30820 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
30830 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f  e *pRoot;.  Pgno
30840 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74   pgnoRoot;.  int
30850 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
30860 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
30870 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
30880 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
30890 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
308a0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
308b0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
308c0 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20  ction first */. 
308d0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
308e0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
308f0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
30900 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
30910 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
30920 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
30930 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
30940 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30950 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
30960 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
30970 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
30980 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
30990 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
309a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
309b0 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
309c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
309d0 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
309e0 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
309f0 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
30a00 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
30a10 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
30a20 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
30a30 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
30a40 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
30a50 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
30a60 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
30a70 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
30a80 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
30a90 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
30aa0 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
30ab0 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
30ac0 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
30ad0 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
30ae0 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
30af0 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
30b00 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
30b10 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
30b20 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
30b30 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
30b40 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
30b50 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
30b60 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
30b70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
30b80 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
30b90 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
30ba0 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
30bb0 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
30bc0 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
30bd0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
30be0 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
30bf0 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
30c00 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
30c10 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
30c20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
30c30 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
30c40 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
30c50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
30c60 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
30c70 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
30c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
30ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30cb0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
30cc0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
30cd0 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
30ce0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
30cf0 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
30d00 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
30d10 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
30d20 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
30d30 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f    while( pgnoRoo
30d40 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
30d50 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
30d60 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
30d70 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
30d80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
30d90 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
30da0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
30db0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
30dc0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
30dd0 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
30de0 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
30df0 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
30e00 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
30e10 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
30e20 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
30e30 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
30e40 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
30e50 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
30e60 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
30e70 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
30e80 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
30e90 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
30ea0 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
30eb0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
30ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
30ee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30ef0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
30f00 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
30f10 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
30f20 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
30f30 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
30f40 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
30f50 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
30f60 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
30f70 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
30f80 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
30f90 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
30fa0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
30fb0 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
30fc0 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
30fd0 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
30fe0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
30ff0 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
31000 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
31010 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
31020 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
31030 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
31040 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
31050 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
31060 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
31070 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
31080 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
31090 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
310a0 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
310b0 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
310c0 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
310d0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
310e0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
310f0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
31100 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
31110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
31130 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
31140 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
31150 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
31160 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
31170 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
31180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31190 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
311a0 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
311b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
311c0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
311d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
311e0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
311f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
31200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
31210 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
31220 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
31230 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
31240 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
31250 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31260 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
31270 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
31280 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
312a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
312b0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
312c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
312d0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
312e0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
312f0 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
31300 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30  age, pgnoMove, 0
31310 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
31320 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
31330 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
31340 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
31350 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
31360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
31380 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
31390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
313a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
313b0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
313c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
313d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
313e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
313f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
31400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31410 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
31420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31430 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31440 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
31450 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
31460 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
31470 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
31480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
31490 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
314a0 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
314b0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
314c0 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
314d0 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
314e0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
314f0 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
31500 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
31510 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
31520 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
31530 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31540 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
31550 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
31560 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
31570 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
31580 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
31590 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
315a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
315b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
315c0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
315d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
315e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
315f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
31600 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
31610 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
31620 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31630 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
31640 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
31650 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31660 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
31670 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
31680 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
31690 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
316a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
316b0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
316c0 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
316d0 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
316e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
316f0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
31700 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
31710 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
31720 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
31730 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
31740 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
31750 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
31760 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
31770 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
31780 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
31790 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
317a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
317b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
317c0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
317d0 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
317e0 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
317f0 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
31800 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
31810 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
31820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
31830 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
31840 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
31850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
31860 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
31870 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
31880 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
31890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
318a0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
318b0 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ar */.  int free
318c0 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
318d0 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
318e0 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
318f0 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
31900 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
31910 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
31920 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
31930 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
31940 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31950 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
31960 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
31970 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
31980 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
31990 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
319a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
319b0 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
319c0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
319d0 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
319e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
319f0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
31a00 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
31a10 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
31a20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
31a30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31a40 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
31a50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31a60 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
31a70 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
31a80 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
31a90 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
31aa0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
31ab0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
31ac0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31ad0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
31ae0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
31af0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
31b00 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
31b10 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
31b20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
31b30 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
31b40 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
31b50 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
31b60 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
31b70 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
31b80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31b90 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
31ba0 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  ge_out;.  }else 
31bb0 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a  if( pnChange ){.
31bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31bd0 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
31be0 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50   *pnChange += pP
31bf0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  age->nCell;.  }.
31c00 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
31c10 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
31c20 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
31c30 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
31c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31c50 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
31c60 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
31c70 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
31c80 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
31c90 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
31ca0 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
31cb0 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
31cc0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31ce0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
31cf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
31d00 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
31d10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
31d20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
31d30 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
31d40 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
31d50 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
31d60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
31d70 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
31d80 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
31d90 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
31da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
31db0 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
31dc0 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
31dd0 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
31de0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
31df0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
31e00 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
31e10 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
31e20 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
31e30 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
31e40 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e  .**.** If pnChan
31e50 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
31e60 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  then table iTabl
31e70 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  e must be an int
31e80 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  key table. The.*
31e90 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * integer value 
31ea0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e  pointed to by pn
31eb0 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d  Change is increm
31ec0 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
31ed0 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  ber of.** entrie
31ee0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
31ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
31f00 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
31f10 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
31f20 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  le, int *pnChang
31f30 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
31f40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
31f50 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
31f60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
31f70 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
31f80 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  b;.  if( p->inTr
31f90 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
31fa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
31fb0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
31fc0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
31fd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
31fe0 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63  else if( (rc = c
31ff0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
32000 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21   iTable, 0, 1))!
32010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32020 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
32030 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  do */.  }else if
32040 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
32050 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
32060 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30  s(pBt, iTable, 0
32070 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  )) ){.    /* not
32080 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
32090 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
320a0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
320b0 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
320c0 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  ble, 0, pnChange
320d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
320e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
320f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32100 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
32110 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
32120 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
32130 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
32140 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
32150 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
32160 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
32170 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
32180 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
32190 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
321a0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
321b0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
321c0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
321d0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
321e0 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
321f0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
32200 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
32210 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
32220 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
32230 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
32240 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
32250 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
32260 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
32270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32280 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
32290 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
322a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
322b0 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
322c0 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
322d0 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
322e0 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
322f0 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
32300 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
32310 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
32320 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
32330 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
32340 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
32350 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
32360 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
32370 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
32380 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
32390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
323a0 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
323b0 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
323c0 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
323d0 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
323e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
323f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
32400 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
32410 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
32420 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
32430 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
32440 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
32450 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
32460 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
32470 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
32480 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
32490 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
324a0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
324b0 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
324c0 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
324d0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
324e0 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c  nt btreeDropTabl
324f0 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
32500 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
32510 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
32520 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
32530 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
32540 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
32550 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
32560 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
32570 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
32580 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
32590 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
325a0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
325b0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
325c0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
325d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
325e0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
325f0 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66   drop a table if
32600 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65   any cursors are
32610 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a   open on the.  *
32620 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
32630 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61   is because in a
32640 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
32650 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a  the backend may.
32660 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76    ** need to mov
32670 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70  e another root-p
32680 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61  age to fill a ga
32690 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
326a0 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20  leted.  ** root 
326b0 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e  page. If an open
326c0 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
326d0 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72  g this page a pr
326e0 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a  oblem would .  *
326f0 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  * occur..  */.  
32700 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
32710 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
32720 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
32730 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
32740 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
32750 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
32760 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
32770 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32780 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
32790 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
327a0 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a  (p, iTable, 0);.
327b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
327c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
327d0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
327e0 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
327f0 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
32800 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
32810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32820 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
32830 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
32840 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
32850 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
32860 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
32870 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
32880 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
32890 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
328a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
328b0 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
328c0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
328d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
328e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
328f0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32900 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
32910 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32920 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
32930 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
32940 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
32950 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
32960 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
32970 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
32980 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
32990 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
329a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
329b0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
329c0 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
329d0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
329e0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
329f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
32a00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32a10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
32a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
32a40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
32a50 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
32a60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
32a70 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
32a80 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
32a90 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
32aa0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
32ab0 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
32ac0 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
32ad0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
32ae0 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
32af0 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
32b00 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
32b10 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
32b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32b30 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
32b40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32b50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
32b60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32b70 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
32b80 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
32b90 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
32ba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
32bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
32be0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
32bf0 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52  (pBt, pMove, PTR
32c00 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
32c10 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20   iTable, 0);.   
32c20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32c30 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
32c40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
32c80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
32c90 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
32ca0 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
32cb0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
32cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32cd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
32ce0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
32cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
32d00 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
32d10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32d20 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
32d30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32d60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
32d70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74  iMoved = maxRoot
32d80 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Pgno;.      }.. 
32d90 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
32da0 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61  new 'max-root-pa
32db0 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65  ge' value in the
32dc0 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
32dd0 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
32de0 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  is the old value
32df0 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20   less one, less 
32e00 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74  one more if that
32e10 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20   happens to.    
32e20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70    ** be a root-p
32e30 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73  age number, less
32e40 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68   one again if th
32e50 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  at is the.      
32e60 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ** PENDING_BYTE_
32e70 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  PAGE..      */. 
32e80 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
32e90 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  --;.      if( ma
32ea0 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49  xRootPgno==PENDI
32eb0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
32ed0 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
32ee0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61    }.      if( ma
32ef0 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41  xRootPgno==PTRMA
32f00 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61  P_PAGENO(pBt, ma
32f10 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20  xRootPgno) ){.  
32f20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
32f30 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
32f40 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f     assert( maxRo
32f50 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  otPgno!=PENDING_
32f60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
32f70 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
32f80 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
32f90 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f  Meta(p, 4, maxRo
32fa0 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  otPgno);.    }el
32fb0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
32fc0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
32fd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32fe0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
32ff0 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
33000 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
33010 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20  3BtreeDropTable 
33020 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61  was called on pa
33030 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72  ge 1. */.    zer
33040 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46  oPage(pPage, PTF
33050 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
33060 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
33070 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
33080 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
33090 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
330a0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
330b0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
330c0 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
330d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
330e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
330f0 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
33100 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
33110 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c  treeDropTable(p,
33120 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64   iTable, piMoved
33130 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33140 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
33150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
33160 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d  * Read the meta-
33170 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
33180 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
33190 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  le.  Meta[0].** 
331a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
331b0 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72   free pages curr
331c0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
331d0 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a  abase.  Meta[1].
331e0 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b  ** through meta[
331f0 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c  15] are availabl
33200 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67  e for use by hig
33210 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74  her layers.  Met
33220 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d  a[0].** is read-
33230 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73  only, the others
33240 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
33250 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65  .** .** The sche
33260 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73  ma layer numbers
33270 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66   meta values dif
33280 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68  ferently.  At th
33290 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65  e schema.** laye
332a0 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f  r (and the SetCo
332b0 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f  okie and ReadCoo
332c0 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65  kie opcodes) the
332d0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72   number of.** fr
332e0 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20  ee pages is not 
332f0 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f  visible.  So Coo
33300 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61  kie[0] is the sa
33310 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a  me as Meta[1]..*
33320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
33330 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20  eeGetMeta(Btree 
33340 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
33350 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61   *pMeta){.  DbPa
33360 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b  ge *pDbPage = 0;
33370 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
33380 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
33390 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
333a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
333b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
333c0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
333d0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61  p->db;..  /* Rea
333e0 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61  ding a meta-data
333f0 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20   value requires 
33400 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  a read-lock on p
33410 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65  age 1 (and hence
33420 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
33430 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57  _master table. W
33440 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b  e grab this lock
33450 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
33460 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e  hether or.  ** n
33470 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  ot the SQLITE_Re
33480 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
33490 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74  ag is set (the t
334a0 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
334b0 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72  age.  ** 1 is tr
334c0 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69  eated as a speci
334d0 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79  al case by query
334e0 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20  TableLock() and 
334f0 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20  lockTable())..  
33500 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  */.  rc = queryT
33510 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
33520 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
33530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
33550 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
33560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
33570 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
33580 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
33590 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
335a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62   ){.    /* The b
335b0 2d 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  -tree is already
335c0 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
335d0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f  ence to page 1 o
335e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
335f0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74     ** file. In t
33600 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 71  his case the req
33610 75 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20  uired meta-data 
33620 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61  value can be rea
33630 64 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a  d directly.    *
33640 2a 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  * from the page 
33650 64 61 74 61 20 6f 66 20 74 68 69 73 20 72 65 66  data of this ref
33660 65 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20  erence. This is 
33670 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
33680 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75  than.    ** requ
33690 65 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66  esting a new ref
336a0 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20  erence from the 
336b0 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20  pager layer..   
336c0 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75   */.    pP1 = (u
336d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
336e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
336f0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
33700 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f  /* The b-tree do
33710 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  es not have a re
33720 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
33730 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
33740 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f  e file..    ** O
33750 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74  btain one from t
33760 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a  he pager layer..
33770 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
33780 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
33790 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
337a0 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  &pDbPage);.    i
337b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73  f( rc ){.      s
337c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
337d0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
337e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
337f0 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
33800 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
33810 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
33820 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74  ge);.  }.  *pMet
33830 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  a = get4byte(&pP
33840 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a  1[36 + idx*4]);.
33850 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74  .  /* If the b-t
33860 72 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69  ree is not holdi
33870 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
33880 6f 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f  o page 1, then o
33890 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71  ne was .  ** req
338a0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
338b0 70 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74  pager layer in t
338c0 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
338d0 52 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  Release it now..
338e0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d    */.  if( !pBt-
338f0 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73  >pPage1 ){.    s
33900 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
33910 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
33920 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
33930 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
33940 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
33950 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
33960 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
33970 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
33980 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
33990 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
339a0 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
339b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
339c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
339d0 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
339e0 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
339f0 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
33a00 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20  ndif..  /* Grab 
33a10 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  the read-lock on
33a20 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63   page 1. */.  rc
33a30 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
33a40 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
33a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
33a60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
33a70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
33a80 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
33a90 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
33aa0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
33ab0 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
33ac0 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
33ad0 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
33ae0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33af0 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
33b00 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
33b10 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
33b20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b30 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
33b40 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
33b50 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
33b60 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
33b70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
33b80 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
33b90 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
33ba0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
33bb0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
33bc0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
33bd0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
33be0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
33bf0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
33c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
33c10 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
33c20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50     pP1 = pBt->pP
33c30 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
33c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33c50 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
33c60 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
33c70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
33c90 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
33ca0 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
33cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33cc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33cd0 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37        if( idx==7
33ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
33cf0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
33d00 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20  uum || iMeta==0 
33d10 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
33d20 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69  t( iMeta==0 || i
33d30 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Meta==1 );.     
33d40 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
33d50 75 6d 20 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a  um = (u8)iMeta;.
33d60 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33d70 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
33d80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
33d90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33da0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33db0 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74  e flag byte at t
33dc0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
33dd0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
33de0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63  e cursor.** is c
33df0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
33e00 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  g to..*/.int sql
33e10 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42  ite3BtreeFlags(B
33e20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
33e30 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
33e40 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51  about CURSOR_REQ
33e50 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20  UIRESEEK state? 
33e60 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  Probably need to
33e70 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f   call.  ** resto
33e80 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
33e90 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  () here..  */.  
33ea0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
33eb0 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50    restoreCursorP
33ec0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
33ed0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
33ee0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
33ef0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e];.  assert( cu
33f00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
33f10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
33f20 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43  ( pPage->pBt==pC
33f30 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74  ur->pBt );.  ret
33f40 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67  urn pPage ? pPag
33f50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
33f60 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a  hdrOffset] : 0;.
33f70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
33f80 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
33f90 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
33fa0 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
33fb0 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
33fc0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
33fd0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
33fe0 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
33ff0 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
34000 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
34010 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
34020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34030 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
34040 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
34050 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
34060 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
34070 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
34080 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
34090 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
340a0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
340b0 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
340c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
340d0 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
340e0 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
340f0 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
34100 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
34110 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
34120 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
34130 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
34140 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43  ormat);.  if( pC
34150 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68  heck->errMsg.nCh
34160 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ar ){.    sqlite
34170 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
34180 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
34190 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20   "\n", 1);.  }. 
341a0 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20   if( zMsg1 ){.  
341b0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
341c0 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
341d0 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  >errMsg, zMsg1, 
341e0 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
341f0 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65  e3VXPrintf(&pChe
34200 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a  ck->errMsg, 1, z
34210 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
34220 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
34230 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e   pCheck->errMsg.
34240 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
34250 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
34260 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
34270 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
34280 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
34290 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
342a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
342b0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
342c0 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
342d0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
342e0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
342f0 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
34300 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
34310 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
34320 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
34330 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
34340 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
34350 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
34360 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
34370 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
34380 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
34390 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
343a0 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
343b0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
343c0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
343d0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
343e0 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
343f0 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
34400 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
34410 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
34420 2c 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63 68  , Pgno iPage, ch
34430 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
34440 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
34450 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
34460 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
34470 61 67 65 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  age ){.    check
34480 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
34490 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
344a0 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
344b0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
344c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
344d0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
344e0 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
344f0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
34500 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
34510 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
34520 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
34530 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
34540 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
34550 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
34560 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
34570 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
34580 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34590 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
345a0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
345b0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
345c0 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
345d0 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
345e0 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
345f0 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
34600 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
34610 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
34620 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
34630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
34640 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
34650 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
34660 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
34670 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
34680 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
34690 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
346a0 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
346b0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
346c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
346d0 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
346e0 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
346f0 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
34700 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
34710 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
34720 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
34730 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
34740 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
34750 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
34760 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
34770 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
34780 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
34790 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
347a0 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
347b0 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
347c0 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
347d0 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
347e0 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
347f0 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
34800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34820 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d  _NOMEM ) pCheck-
34830 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
34840 31 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  1;.    checkAppe
34850 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
34860 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20  ontext, "Failed 
34870 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b  to read ptrmap k
34880 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b  ey=%d", iChild);
34890 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
348a0 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54  ..  if( ePtrmapT
348b0 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50  ype!=eType || iP
348c0 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61  trmapParent!=iPa
348d0 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63  rent ){.    chec
348e0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
348f0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  k, zContext, .  
34900 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70      "Bad ptr map
34910 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78   entry key=%d ex
34920 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67  pected=(%d,%d) g
34930 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20  ot=(%d,%d)", .  
34940 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70      iChild, eTyp
34950 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72  e, iParent, ePtr
34960 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70  mapType, iPtrmap
34970 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23  Parent);.  }.}.#
34980 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
34990 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
349a0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
349b0 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c   or of an overfl
349c0 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
349d0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
349e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
349f0 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   on the list is 
34a00 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  N..*/.static voi
34a10 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49  d checkList(.  I
34a20 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
34a30 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  ck,  /* Integrit
34a40 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65  y checking conte
34a50 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72  xt */.  int isFr
34a60 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  eeList,       /*
34a70 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65   True for a free
34a80 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72  list.  False for
34a90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
34aa0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ist */.  int iPa
34ab0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
34ac0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
34ad0 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  r first page in 
34ae0 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
34af0 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
34b00 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
34b10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34b20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
34b30 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
34b40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
34b50 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
34b60 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ages */.){.  int
34b70 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74   i;.  int expect
34b80 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46  ed = N;.  int iF
34b90 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20  irst = iPage;.  
34ba0 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26  while( N-- > 0 &
34bb0 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20  & pCheck->mxErr 
34bc0 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
34bd0 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e  OvflPage;.    un
34be0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76  signed char *pOv
34bf0 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  flData;.    if( 
34c00 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20  iPage<1 ){.     
34c10 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
34c20 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
34c30 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f  ,.         "%d o
34c40 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69  f %d pages missi
34c50 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77  ng from overflow
34c60 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
34c70 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
34c80 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20   N+1, expected, 
34c90 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62  iFirst);.      b
34ca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
34cb0 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68  if( checkRef(pCh
34cc0 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  eck, iPage, zCon
34cd0 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  text) ) break;. 
34ce0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
34cf0 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  gerGet(pCheck->p
34d00 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61  Pager, (Pgno)iPa
34d10 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20  ge, &pOvflPage) 
34d20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
34d30 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
34d40 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65  zContext, "faile
34d50 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64  d to get page %d
34d60 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
34d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
34d80 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75    pOvflData = (u
34d90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
34da0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
34db0 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ta(pOvflPage);. 
34dc0 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73     if( isFreeLis
34dd0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
34de0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
34df0 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e  flData[4]);.#ifn
34e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34e10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
34e20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
34e30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34e40 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
34e50 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67  map(pCheck, iPag
34e60 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
34e70 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
34e80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
34e90 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68  .      if( n>pCh
34ea0 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  eck->pBt->usable
34eb0 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20  Size/4-2 ){.    
34ec0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34ed0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
34ee0 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
34ef0 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63  "freelist leaf c
34f00 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20  ount too big on 
34f10 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
34f20 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20  ;.        N--;. 
34f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34f40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
34f50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
34f60 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
34f70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
34f80 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  flData[8+i*4]);.
34f90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34fa0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34fb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68           if( pCh
34fc0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
34fd0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34fe0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
34ff0 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67  pCheck, iFreePag
35000 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
35010 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
35020 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
35030 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63  ndif.          c
35040 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
35050 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74  iFreePage, zCont
35060 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ext);.        }.
35070 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a          N -= n;.
35080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
35090 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
350a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
350b0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
350c0 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
350d0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
350e0 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20  acuum and iPage 
350f0 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
35100 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
35110 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c   this overflow l
35120 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ist, check that 
35130 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
35140 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20  entry for.      
35150 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
35160 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50   page matches iP
35170 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  age..      */.  
35180 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
35190 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
351a0 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20  && N>0 ){.      
351b0 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70    i = get4byte(p
351c0 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20  OvflData);.     
351d0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
351e0 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50  Check, i, PTRMAP
351f0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67  _OVERFLOW2, iPag
35200 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
35210 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
35220 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67  if.    iPage = g
35230 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
35240 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  a);.    sqlite3P
35250 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50  agerUnref(pOvflP
35260 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  age);.  }.}.#end
35270 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35280 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
35290 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
352a0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
352b0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
352c0 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74  Do various sanit
352d0 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69  y checks on a si
352e0 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74  ngle page of a t
352f0 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ree.  Return.** 
35300 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20  the tree depth. 
35310 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75   Root pages retu
35320 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f  rn 0.  Parents o
35330 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20  f root pages.** 
35340 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f  return 1, and so
35350 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54   forth..** .** T
35360 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20  hese checks are 
35370 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  done:.**.**     
35380 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   1.  Make sure t
35390 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72  hat cells and fr
353a0 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20  eeblocks do not 
353b0 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20  overlap.**      
353c0 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20      but combine 
353d0 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  to completely co
353e0 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ver the page..**
353f0 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73    NO  2.  Make s
35400 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72  ure cell keys ar
35410 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20  e in order..**  
35420 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72  NO  3.  Make sur
35430 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73  e no key is less
35440 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
35450 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a  o zLowerBound..*
35460 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20  *  NO  4.  Make 
35470 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67  sure no key is g
35480 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
35490 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f  qual to zUpperBo
354a0 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20  und..**      5. 
354b0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
354c0 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77  rity of overflow
354d0 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20   pages..**      
354e0 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20  6.  Recursively 
354f0 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61  call checkTreePa
35500 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72  ge on all childr
35510 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20  en..**      7.  
35520 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
35530 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69  depth of all chi
35540 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d  ldren is the sam
35550 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d  e..**      8.  M
35560 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61  ake sure this pa
35570 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33  ge is at least 3
35580 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20  3% full or else 
35590 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  it is.**        
355a0 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68    the root of th
355b0 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  e tree..*/.stati
355c0 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50  c int checkTreeP
355d0 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79  age(.  Integrity
355e0 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
355f0 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  Context for the 
35600 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a  sanity check */.
35610 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
35620 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35630 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
35640 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  ge to check */. 
35650 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
35660 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
35670 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
35680 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
35690 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
356a0 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
356b0 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
356c0 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
356d0 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
356e0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
356f0 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
35700 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
35710 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
35720 61 72 20 2a 68 69 74 20 3d 20 30 3b 0a 0a 20 20  ar *hit = 0;..  
35730 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
35740 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
35750 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  ), zContext, "Pa
35760 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
35770 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
35780 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
35790 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
357a0 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
357b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
357c0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
357d0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
357e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
357f0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
35800 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
35810 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
35820 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  ;.  if( (rc = sq
35830 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
35840 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61  e(pBt, (Pgno)iPa
35850 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
35860 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =0 ){.    if( rc
35870 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
35880 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46   pCheck->mallocF
35890 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 63  ailed = 1;.    c
358a0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
358b0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
358c0 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
358d0 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20  o get the page. 
358e0 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20  error code=%d", 
358f0 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
35900 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63  0;.  }.  if( (rc
35910 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
35920 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 29 21  nitPage(pPage))!
35930 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =0 ){.    if( rc
35940 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
35950 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46   pCheck->mallocF
35960 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 63  ailed = 1;.    c
35970 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
35980 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
35990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
359a0 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65      "sqlite3Btre
359b0 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  eInitPage() retu
359c0 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
359d0 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
359e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
359f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
35a00 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
35a10 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
35a20 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
35a30 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
35a40 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
35a50 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
35a60 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35a70 65 6c 6c 3b 0a 20 20 20 20 75 33 32 20 73 7a 3b  ell;.    u32 sz;
35a80 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
35a90 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
35aa0 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
35ab0 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
35ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35ad0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
35ae0 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
35af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f  .             "O
35b00 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
35b10 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
35b20 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
35b30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
35b40 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,i);.    sqlite3
35b50 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
35b60 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
35b70 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
35b80 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
35b90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
35ba0 4b 65 79 20 29 20 73 7a 20 2b 3d 20 28 69 6e 74  Key ) sz += (int
35bb0 29 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  )info.nKey;.    
35bc0 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f  assert( sz==info
35bd0 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  .nPayload );.   
35be0 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f   if( sz>info.nLo
35bf0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  cal ){.      int
35c00 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69   nPage = (sz - i
35c10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61  nfo.nLocal + usa
35c20 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73  bleSize - 5)/(us
35c30 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
35c40 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
35c50 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
35c60 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
35c70 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  low]);.#ifndef S
35c80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
35c90 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
35ca0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
35cb0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
35cc0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
35cd0 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  gnoOvfl, PTRMAP_
35ce0 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65  OVERFLOW1, iPage
35cf0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
35d00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35d10 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65    checkList(pChe
35d20 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ck, 0, pgnoOvfl,
35d30 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   nPage, zContext
35d40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
35d50 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66   Check sanity of
35d60 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65   left child page
35d70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35d80 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
35d90 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
35da0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23  t4byte(pCell);.#
35db0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35dc0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
35dd0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
35de0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
35df0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
35e00 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
35e10 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
35e20 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
35e30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35e40 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65    d2 = checkTree
35e50 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
35e60 6f 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  o, zContext);.  
35e70 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64      if( i>0 && d
35e80 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20  2!=depth ){.    
35e90 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
35ea0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
35eb0 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65  ext, "Child page
35ec0 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29   depth differs")
35ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35ee0 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20  depth = d2;.    
35ef0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  }.  }.  if( !pPa
35f00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
35f10 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
35f20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
35f30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
35f40 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
35f50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
35f60 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
35f70 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ext, .          
35f80 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70             "On p
35f90 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20  age %d at right 
35fa0 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29  child: ", iPage)
35fb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
35fc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
35fd0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
35fe0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
35ff0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
36000 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
36010 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
36020 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
36030 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
36040 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  age(pCheck, pgno
36050 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  , zContext);.  }
36060 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  . .  /* Check fo
36070 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72  r complete cover
36080 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a  age of the page.
36090 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50    */.  data = pP
360a0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
360b0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
360c0 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71  fset;.  hit = sq
360d0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
360e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
360f0 3b 0a 20 20 69 66 28 20 68 69 74 3d 3d 30 20 29  ;.  if( hit==0 )
36100 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61  {.    pCheck->ma
36110 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
36120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 31 36    }else{.    u16
36130 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20 3d   contentOffset =
36140 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
36150 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 69 66 20  hdr+5]);.    if 
36160 28 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20 3e  (contentOffset >
36170 20 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20   usableSize) {. 
36180 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
36190 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
361a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361b0 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e       "Corruption
361c0 20 64 65 74 65 63 74 65 64 20 69 6e 20 68 65 61   detected in hea
361d0 64 65 72 20 6f 6e 20 70 61 67 65 20 25 64 22 2c  der on page %d",
361e0 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
361f0 67 6f 74 6f 20 63 68 65 63 6b 5f 70 61 67 65 5f  goto check_page_
36200 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  abort;.    }.   
36210 20 6d 65 6d 73 65 74 28 68 69 74 2b 63 6f 6e 74   memset(hit+cont
36220 65 6e 74 4f 66 66 73 65 74 2c 20 30 2c 20 75 73  entOffset, 0, us
36230 61 62 6c 65 53 69 7a 65 2d 63 6f 6e 74 65 6e 74  ableSize-content
36240 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 6d 65 6d  Offset);.    mem
36250 73 65 74 28 68 69 74 2c 20 31 2c 20 63 6f 6e 74  set(hit, 1, cont
36260 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  entOffset);.    
36270 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
36280 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
36290 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
362a0 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
362b0 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
362c0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
362d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
362e0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
362f0 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
36300 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20 73  2]);.      u16 s
36310 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
36320 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
36330 66 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a  f( pc<=usableSiz
36340 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 69 7a  e ){.        siz
36350 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
36360 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
36370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36380 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29   if( (pc+size-1)
36390 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
363a0 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pc<0 ){.        
363b0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
363c0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
363d0 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
363e0 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
363f0 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
36400 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
36410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36420 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a      for(j=pc+siz
36430 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29  e-1; j>=pc; j--)
36440 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
36450 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
36460 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79  (cnt=0, i=get2by
36470 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
36480 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c  ; i>0 && i<usabl
36490 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30  eSize && cnt<100
364a0 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20  00; .           
364b0 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  cnt++){.      in
364c0 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
364d0 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20  e(&data[i+2]);. 
364e0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
364f0 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29    if( (i+size-1)
36500 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  >=usableSize || 
36510 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  i<0 ){.        c
36520 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
36530 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20  heck, 0,  .     
36540 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69         "Corrupti
36550 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63  on detected in c
36560 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25  ell %d on page %
36570 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20  d",i,iPage,0);. 
36580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36590 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65      for(j=i+size
365a0 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68  -1; j>=i; j--) h
365b0 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d  it[j]++;.      }
365c0 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62  .      i = get2b
365d0 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20  yte(&data[i]);. 
365e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63     }.    for(i=c
365f0 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69  nt=0; i<usableSi
36600 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ze; i++){.      
36610 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b  if( hit[i]==0 ){
36620 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  .        cnt++;.
36630 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
36640 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  hit[i]>1 ){.    
36650 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
36660 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20  sg(pCheck, 0,.  
36670 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c          "Multipl
36680 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20  e uses for byte 
36690 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20  %d of page %d", 
366a0 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  i, iPage);.     
366b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
366c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
366d0 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d  cnt!=data[hdr+7]
366e0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
366f0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
36700 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22   0, .          "
36710 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  Fragmented space
36720 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f   is %d byte repo
36730 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61  rted as %d on pa
36740 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ge %d",.        
36750 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b    cnt, data[hdr+
36760 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  7], iPage);.    
36770 7d 0a 20 20 7d 0a 63 68 65 63 6b 5f 70 61 67 65  }.  }.check_page
36780 5f 61 62 6f 72 74 3a 0a 20 20 69 66 20 28 68 69  _abort:.  if (hi
36790 74 29 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  t) sqlite3PageFr
367a0 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65  ee(hit);..  rele
367b0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
367c0 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31    return depth+1
367d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
367e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
367f0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
36800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36810 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
36820 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
36830 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
36840 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68  lete check of th
36850 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69  e given BTree fi
36860 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a  le.  aRoot[] is.
36870 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
36880 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72  ages numbers wer
36890 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62  e each page numb
368a0 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  er is the root p
368b0 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c  age of.** a tabl
368c0 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65  e.  nRoot is the
368d0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
368e0 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a  es in aRoot..**.
368f0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  ** Write the num
36900 62 65 72 20 6f 66 20 65 72 72 6f 72 20 73 65 65  ber of error see
36910 6e 20 69 6e 20 2a 70 6e 45 72 72 2e 20 20 45 78  n in *pnErr.  Ex
36920 63 65 70 74 20 66 6f 72 20 73 6f 6d 65 20 6d 65  cept for some me
36930 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
36940 6f 6e 20 65 72 72 6f 72 73 2c 20 20 61 6e 20 65  on errors,  an e
36950 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 6c  rror message hel
36960 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
36970 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c  ined from.** mal
36980 6c 6f 63 20 69 73 20 72 65 74 75 72 6e 65 64 20  loc is returned 
36990 69 66 20 2a 70 6e 45 72 72 20 69 73 20 6e 6f 6e  if *pnErr is non
369a0 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70 6e 45 72  -zero.  If *pnEr
369b0 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c 4c 20 69  r==0 then NULL i
369c0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 20  s.** returned.  
369d0 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
369e0 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
369f0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
36a00 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  urned..*/.char *
36a10 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
36a20 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74  grityCheck(.  Bt
36a30 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54  ree *p,     /* T
36a40 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63  he btree to be c
36a50 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
36a60 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20  *aRoot,   /* An 
36a70 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61  array of root pa
36a80 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ges numbers for 
36a90 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73  individual trees
36aa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c   */.  int nRoot,
36ab0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36ac0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
36ad0 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45  t[] */.  int mxE
36ae0 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72  rr,    /* Stop r
36af0 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20  eporting errors 
36b00 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20  after this many 
36b10 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20  */.  int *pnErr 
36b20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62     /* Write numb
36b30 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
36b40 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62  n to this variab
36b50 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  le */.){.  Pgno 
36b60 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20  i;.  int nRef;. 
36b70 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68   IntegrityCk sCh
36b80 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  eck;.  BtShared 
36b90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
36ba0 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d 3b   char zErr[100];
36bb0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
36bc0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
36bd0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e  >db = p->db;.  n
36be0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
36bf0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
36c00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c  pPager);.  if( l
36c10 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
36c20 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  y(p)!=SQLITE_OK 
36c30 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20  ){.    *pnErr = 
36c40 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  1;.    sqlite3Bt
36c50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
36c60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 44   return sqlite3D
36c70 62 53 74 72 44 75 70 28 30 2c 20 22 63 61 6e 6e  bStrDup(0, "cann
36c80 6f 74 20 61 63 71 75 69 72 65 20 61 20 72 65 61  ot acquire a rea
36c90 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
36ca0 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20  tabase");.  }.  
36cb0 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74  sCheck.pBt = pBt
36cc0 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65  ;.  sCheck.pPage
36cd0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
36ce0 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  .  sCheck.nPage 
36cf0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
36d00 28 73 43 68 65 63 6b 2e 70 42 74 29 3b 0a 20 20  (sCheck.pBt);.  
36d10 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d  sCheck.mxErr = m
36d20 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e  xErr;.  sCheck.n
36d30 45 72 72 20 3d 20 30 3b 0a 20 20 73 43 68 65 63  Err = 0;.  sChec
36d40 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  k.mallocFailed =
36d50 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30   0;.  *pnErr = 0
36d60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36d70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36d80 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75  .  if( pBt->nTru
36d90 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68  nc!=0 ){.    sCh
36da0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d  eck.nPage = pBt-
36db0 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e  >nTrunc;.  }.#en
36dc0 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b  dif.  if( sCheck
36dd0 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  .nPage==0 ){.   
36de0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
36df0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
36e00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
36e10 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
36e20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  0;.  }.  sCheck.
36e30 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 4d  anRef = sqlite3M
36e40 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e  alloc( (sCheck.n
36e50 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73  Page+1)*sizeof(s
36e60 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20  Check.anRef[0]) 
36e70 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b  );.  if( !sCheck
36e80 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e  .anRef ){.    un
36e90 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
36ea0 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45  d(pBt);.    *pnE
36eb0 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  rr = 1;.    sqli
36ec0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
36ed0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
36ee0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
36ef0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20  <=sCheck.nPage; 
36f00 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52  i++){ sCheck.anR
36f10 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69  ef[i] = 0; }.  i
36f20 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
36f30 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28  PAGE(pBt);.  if(
36f40 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
36f50 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61   ){.    sCheck.a
36f60 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  nRef[i] = 1;.  }
36f70 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
36f80 75 6d 49 6e 69 74 28 26 73 43 68 65 63 6b 2e 65  umInit(&sCheck.e
36f90 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a  rrMsg, zErr, siz
36fa0 65 6f 66 28 7a 45 72 72 29 2c 20 32 30 30 30 30  eof(zErr), 20000
36fb0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
36fc0 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
36fd0 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a  the freelist.  *
36fe0 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73  /.  checkList(&s
36ff0 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79  Check, 1, get4by
37000 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
37010 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20  >aData[32]),.   
37020 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
37030 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
37040 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69  aData[36]), "Mai
37050 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a  n freelist: ");.
37060 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20  .  /* Check all 
37070 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  the tables..  */
37080 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 69 6e 74  .  for(i=0; (int
37090 29 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65  )i<nRoot && sChe
370a0 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
370b0 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d      if( aRoot[i]
370c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
370d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
370e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
370f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
37100 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b  Vacuum && aRoot[
37110 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68  i]>1 ){.      ch
37120 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63  eckPtrmap(&sChec
37130 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52  k, aRoot[i], PTR
37140 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
37150 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
37160 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
37170 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  age(&sCheck, aRo
37180 6f 74 5b 69 5d 2c 20 22 4c 69 73 74 20 6f 66 20  ot[i], "List of 
37190 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
371a0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
371b0 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
371c0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
371d0 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
371e0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
371f0 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
37200 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
37210 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
37220 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
37230 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
37240 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
37250 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
37260 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
37270 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
37280 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
37290 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
372a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
372b0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
372c0 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
372d0 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
372e0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
372f0 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
37300 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
37310 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
37320 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
37330 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
37340 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
37350 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
37360 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
37370 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
37380 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
37390 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
373a0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
373b0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
373c0 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
373d0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
373e0 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
373f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
37400 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
37410 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
37420 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
37430 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
37440 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
37450 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
37460 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
37470 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
37480 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
37490 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
374a0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
374b0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
374c0 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
374d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
374e0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
374f0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
37500 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
37510 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
37520 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
37530 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
37540 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
37550 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
37560 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
37570 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
37580 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
37590 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
375a0 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
375b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
375c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
375d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
375e0 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 69  heck.anRef);.  i
375f0 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63  f( sCheck.malloc
37600 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
37610 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 65 73  lite3StrAccumRes
37620 65 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73  et(&sCheck.errMs
37630 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d  g);.    *pnErr =
37640 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b 31 3b 0a   sCheck.nErr+1;.
37650 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
37660 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68  }.  *pnErr = sCh
37670 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69 66 28 20  eck.nErr;.  if( 
37680 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20 29  sCheck.nErr==0 )
37690 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
376a0 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72  Reset(&sCheck.er
376b0 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  rMsg);.  return 
376c0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
376d0 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e 65 72  inish(&sCheck.er
376e0 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  rMsg);.}.#endif 
376f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
37700 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
37710 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
37720 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
37730 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
37740 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
37750 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
37760 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  er filename is i
37770 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
37780 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
37790 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
377a0 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
377b0 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
377c0 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
377d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
377e0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
377f0 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
37800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
37810 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
37820 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
37830 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70  gerFilename(p->p
37840 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
37850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
37860 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
37870 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
37880 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
37890 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
378a0 2a 20 54 68 65 20 70 61 67 65 72 20 64 69 72 65  * The pager dire
378b0 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e  ctory name is in
378c0 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20  variant as long 
378d0 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a  as the pager is.
378e0 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73  ** open so it is
378f0 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20   safe to access 
37900 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68  without the BtSh
37910 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63  ared mutex..*/.c
37920 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
37930 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d  e3BtreeGetDirnam
37940 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
37950 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
37960 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
37970 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
37980 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rDirname(p->pBt-
37990 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  >pPager);.}../*.
379a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
379b0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
379c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74  urnal file for t
379d0 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54 68  his database. Th
379e0 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75  e return.** valu
379f0 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e of this routin
37a00 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65  e is the same re
37a10 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
37a20 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
37a30 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
37a40 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e   created or not.
37a50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
37a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
37a70 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
37a80 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
37a90 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
37aa0 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
37ab0 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
37ac0 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
37ad0 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
37ae0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
37af0 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72  tJournalname(Btr
37b00 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
37b10 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
37b20 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
37b30 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
37b40 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  nalname(p->pBt->
37b50 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e  pPager);.}..#ifn
37b60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37b70 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70  VACUUM./*.** Cop
37b80 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  y the complete c
37b90 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f  ontent of pBtFro
37ba0 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41  m into pBtTo.  A
37bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
37bc0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66  must be active f
37bd0 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a  or both files..*
37be0 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
37bf0 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62 65   file pTo may be
37c00 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
37c10 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
37c20 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
37c30 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
37c40 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73  action on pTo is
37c50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a 2a   rolled back. .*
37c60 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
37c70 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f  ul, CommitPhaseO
37c80 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  ne() may be call
37c90 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72 65  ed on pTo before
37ca0 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 20   returning. .** 
37cb0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
37cc0 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74 74  d finish committ
37cd0 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
37ce0 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63 61  ion on pTo by ca
37cf0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
37d00 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a 2a  BtreeCommit()..*
37d10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
37d20 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65  eeCopyFile(Btree
37d30 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46   *pTo, Btree *pF
37d40 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rom){.  int rc =
37d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
37d60 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e 46  no i;..  Pgno nF
37d70 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  romPage;     /* 
37d80 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
37d90 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50 67  in pFrom */.  Pg
37da0 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20 20  no nToPage;     
37db0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
37dc0 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  ages in pTo */. 
37dd0 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b 20   Pgno nNewPage; 
37de0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37df0 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 61  f pages in pTo a
37e00 66 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a 2f  fter the copy */
37e10 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b 20  ..  Pgno iSkip; 
37e20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69          /* Pendi
37e30 6e 67 20 62 79 74 65 20 70 61 67 65 20 69 6e 20  ng byte page in 
37e40 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  pTo */.  int nTo
37e50 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  PageSize;    /* 
37e60 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54 6f  Page size of pTo
37e70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
37e80 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  nt nFromPageSize
37e90 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20  ;  /* Page size 
37ea0 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74 65  of pFrom in byte
37eb0 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65 64  s */..  BtShared
37ec0 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70   *pBtTo = pTo->p
37ed0 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  Bt;.  BtShared *
37ee0 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  pBtFrom = pFrom-
37ef0 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e 64  >pBt;.  pBtTo->d
37f00 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 70  b = pTo->db;.  p
37f10 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46 72  BtFrom->db = pFr
37f20 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50 61  om->db;..  nToPa
37f30 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d 3e  geSize = pBtTo->
37f40 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72 6f  pageSize;.  nFro
37f50 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 46  mPageSize = pBtF
37f60 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  rom->pageSize;..
37f70 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61    if( pTo->inTra
37f80 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
37f90 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e  || pFrom->inTran
37fa0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
37fb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37fc0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
37fd0 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72   if( pBtTo->pCur
37fe0 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
37ff0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
38000 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20   }..  nToPage = 
38010 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
38020 42 74 54 6f 29 3b 0a 20 20 6e 46 72 6f 6d 50 61  BtTo);.  nFromPa
38030 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
38040 75 6e 74 28 70 42 74 46 72 6f 6d 29 3b 0a 20 20  unt(pBtFrom);.  
38050 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f  iSkip = PENDING_
38060 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29  BYTE_PAGE(pBtTo)
38070 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ;..  /* Variable
38080 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68 65   nNewPage is the
38090 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
380a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
380b0 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74  re the.  ** cont
380c0 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75 73  ents of pFrom us
380d0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
380e0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f  page-size of pTo
380f0 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61 67  ..  */.  nNewPag
38100 65 20 3d 20 28 50 67 6e 6f 29 0a 20 20 20 20 20  e = (Pgno).     
38110 28 28 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65  (((i64)nFromPage
38120 2a 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53  *(i64)nFromPageS
38130 69 7a 65 2b 28 69 36 34 29 6e 54 6f 50 61 67 65  ize+(i64)nToPage
38140 53 69 7a 65 2d 31 29 2f 28 69 36 34 29 6e 54 6f  Size-1)/(i64)nTo
38150 50 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 66 6f  PageSize);..  fo
38160 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
38170 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54 6f 50  E_OK && (i<=nToP
38180 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61  age || i<=nNewPa
38190 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  ge); i++){..    
381a0 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65 20 6f  /* Journal the o
381b0 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a 20 20  riginal page..  
381c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53 6b 69    **.    ** iSki
381d0 70 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  p is the page nu
381e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f 63 6b  mber of the lock
381f0 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44 49 4e  ing page (PENDIN
38200 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20 20 20  G_BYTE_PAGE).   
38210 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20   ** in database 
38220 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74 68 65  *pTo (before the
38230 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70 61 67   copy). This pag
38240 65 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  e is never writt
38250 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  en .    ** into 
38260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
38270 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53 6b 69  . Unless i==iSki
38280 70 20 6f 72 20 74 68 65 20 70 61 67 65 20 77 61  p or the page wa
38290 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72 65  s not.    ** pre
382a0 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65 66 6f  sent in pTo befo
382b0 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72  re the copy oper
382c0 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70  ation, journal p
382d0 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f 2e 0a  age i from pTo..
382e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
382f0 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e 54  !=iSkip && i<=nT
38300 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 44  oPage ){.      D
38310 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 3d  bPage *pDbPage =
38320 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
38330 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
38340 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
38350 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
38360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
38380 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38390 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
383a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
383b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 6e  SQLITE_OK && i>n
383c0 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  FromPage ){.    
383d0 20 20 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20        /* Yeah.  
383e0 49 74 20 73 65 65 6d 73 20 77 69 65 72 64 20 74  It seems wierd t
383f0 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65  o call DontWrite
38400 28 29 20 72 69 67 68 74 20 61 66 74 65 72 20 57  () right after W
38410 72 69 74 65 28 29