/ Hex Artifact Content
Login

Artifact 05fae412abe4f72aa52611f5a7180b73f2414d99:


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 35 20 32 30 30 38 2f 31  c,v 1.545 2008/1
0190: 32 2f 30 35 20 32 32 3a 34 30 3a 30 38 20 64 72  2/05 22:40:08 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 70 43 75 72 2d 3e 6e 4b  3Malloc(pCur->nK
2440: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ey);.    if( pKe
2450: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
2460: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
2470: 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e  pCur, 0, pCur->n
2480: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
2490: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
24b0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
24c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24e0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
24f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2500: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2510: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
2520: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
2530: 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2540: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
2550: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
2560: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2570: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
2580: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
2590: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
25a0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
25b0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
25c0: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61        pCur->apPa
25d0: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
25e0: 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
25f0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d   = -1;.    pCur-
2600: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2610: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
2620: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
2630: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
2640: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
2650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
2660: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
2670: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
2680: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
2690: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
26a0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
26b0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
26c0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
26d0: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
26e0: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
26f0: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
2700: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
2710: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
2720: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
2730: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
2740: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
2750: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
2760: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
2770: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
2780: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
2790: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27a0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
27b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
27c0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
27d0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
27e0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
27f0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2800: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
2810: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
2820: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
2830: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
2840: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
2850: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2860: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
2870: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
2880: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
2890: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
28a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
28b0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28e0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
28f0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2900: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
2910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2920: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
2930: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
2940: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2950: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2960: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2970: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
2980: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
2990: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29a0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
29b0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
29c0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
29d0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
29e0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
29f0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
2a00: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
2a10: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
2a20: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
2a30: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
2a40: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
2a50: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
2a60: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
2a70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
2a80: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
2a90: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
2aa0: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
2ab0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2ac0: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
2ad0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
2ae0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69  Position()..*/.i
2af0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
2b00: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2b10: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
2b20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
2b30: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b40: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2b50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b60: 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2b70: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2b80: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2b90: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2ba0: 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2bb0: 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2bc0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
2bd0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2be0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2bf0: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
2c00: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
2c10: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
2c20: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
2c30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2c50: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
2c60: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
2c70: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2c80: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c90: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2ca0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2cb0: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
2cc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cd0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
2ce0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2cf0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
2d00: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2d10: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
2d20: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2d30: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2d40: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
2d50: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
2d60: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2d70: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2d80: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
2d90: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
2da0: 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c  tion it.** was l
2db0: 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20  ast placed at.  
2dc0: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
2dd0: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
2de0: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a  ey are pointing.
2df0: 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ** at is deleted
2e00: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
2e10: 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  them..**.** This
2e20: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2e30: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
2e40: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
2e50: 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20   wrong.  The.** 
2e60: 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76  integer *pHasMov
2e70: 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  ed is set to one
2e80: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
2e90: 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69  as moved and 0 i
2ea0: 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  f not..*/.int sq
2eb0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
2ec0: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
2ed0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48  r *pCur, int *pH
2ee0: 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  asMoved){.  int 
2ef0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74  rc;..  rc = rest
2f00: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2f10: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
2f20: 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  c ){.    *pHasMo
2f30: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ved = 1;.    ret
2f40: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
2f50: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2f70: 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b  pCur->skip!=0 ){
2f80: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
2f90: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
2fa0: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
2fb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2fc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2fd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fe0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
2ff0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
3000: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
3010: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
3020: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
3030: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
3040: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
3050: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
3060: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
3070: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
3080: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  ge number..*/.st
3090: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
30a0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
30b0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
30c0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
30d0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
30e0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
30f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3100: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
3110: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
3120: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
3130: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
3140: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
3150: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
3160: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
3170: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
3180: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
3190: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
31a0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31b0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
31c0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
31d0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
31e0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
31f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
3200: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3210: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
3220: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3230: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
3240: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
3250: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
3260: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
3270: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
3280: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
3290: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
32a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
32b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
32c0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
32d0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
32e0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
32f0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
3300: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
3310: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
3320: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
3330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
3340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
3360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
3370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
3380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
3390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
33a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
33b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
33c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
33d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
33e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
33f0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3400: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3410: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3420: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3430: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3440: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3450: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3460: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3470: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
3480: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
3490: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
34a0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
34b0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
34c0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
34d0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
34e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
34f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3500: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3510: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3520: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3530: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3540: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3550: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3560: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3570: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
3580: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
3590: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
35a0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
35b0: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
35c0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
35d0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
35e0: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
35f0: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
3600: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
3610: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
3620: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
3630: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
3640: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
3650: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
3660: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
3670: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
3680: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
3690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
36a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
36c0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
36d0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
36e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
36f0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
3700: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
3710: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
3720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3730: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
3740: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
3750: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
3760: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
3770: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
3780: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
3790: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
37a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
37b0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
37c0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
37d0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
37e0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
37f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
3800: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
3810: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
3820: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
3830: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
3840: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
3850: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
3860: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
3870: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
3880: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
3890: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
38a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
38b0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
38c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
38d0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
38e0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
38f0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
3900: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
3910: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
3920: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
3930: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
3940: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
3950: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
3960: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3970: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3980: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
3990: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
39a0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
39b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
39c0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
39d0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
39e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
39f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
3a00: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
3a10: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
3a20: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
3a30: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
3a40: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
3a50: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
3a60: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
3a70: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
3a80: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
3a90: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
3aa0: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
3ab0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3ac0: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
3ad0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
3ae0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
3af0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
3b00: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
3b10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
3b20: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
3b30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
3b40: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
3b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
3b60: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
3b70: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
3b80: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
3b90: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
3ba0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
3bb0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
3bc0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 79   ptrmapPutOvfl(y
3bd0: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  ,z) SQLITE_OK.#e
3be0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
3bf0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
3c00: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
3c10: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
3c20: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
3c30: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
3c40: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
3c50: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
3c60: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
3c70: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
3c80: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
3c90: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
3ca0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
3cb0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
3cc0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
3cd0: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
3ce0: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
3cf0: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
3d00: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
3d10: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
3d20: 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66  Data[(P)->cellOf
3d30: 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a  fset+2*(I)])))..
3d40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
3d50: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
3d60: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
3d70: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
3d80: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
3d90: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3da0: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
3db0: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
3dc0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
3dd0: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
3de0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
3df0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
3e00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3e10: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
3e20: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3e30: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
3e40: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
3e50: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
3e60: 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65    struct _OvflCe
3e70: 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70  ll *pOvfl;.    p
3e80: 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61  Ovfl = &pPage->a
3e90: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d  Ovfl[i];.    k =
3ea0: 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20   pOvfl->idx;.   
3eb0: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
3ec0: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
3ed0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
3ee0: 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65  eturn pOvfl->pCe
3ef0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
3f00: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
3f10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
3f20: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3f30: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
3f40: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
3f50: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
3f60: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
3f70: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
3f80: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
3f90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
3fa0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69   function.  sqli
3fb0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3fc0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
3fd0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
3fe0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
3ff0: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  t and sqlite3Btr
4000: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
4010: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
4020: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
4030: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
4040: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
4050: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
4060: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
4070: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
4080: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
4090: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73   instead of.** s
40a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
40b0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
40c0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
40d0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
40e0: 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
40f0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4100: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
4110: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
4120: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
4130: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
4140: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
4150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
4160: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
4170: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
4180: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
4190: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
41a0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
41b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  /.){.  int n;   
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
41e0: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
41f0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
4200: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
4210: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4220: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
4230: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
4240: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4250: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
4260: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
4270: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
4280: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
4290: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
42a0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
42b0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
42c0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
42d0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
42e0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
42f0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
4300: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
4310: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
4320: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61        n += getVa
4330: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
4340: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
4350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
4360: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  ayload = 0;.    
4370: 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  }.    n += getVa
4380: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
4390: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
43a0: 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ey);.    pInfo->
43b0: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
43c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
43d0: 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b  Info->nData = 0;
43e0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
43f0: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
4400: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
4410: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50  pInfo->nKey = nP
4420: 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49  ayload;.  }.  pI
4430: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
4440: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
4450: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
4460: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
4470: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
4480: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
4490: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
44a0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
44b0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
44c0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
44d0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
44e0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
44f0: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4500: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4510: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
4520: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
4530: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
4540: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
4550: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
4560: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
4570: 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f  >nLocal = nPaylo
4580: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
4590: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
45a0: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
45b0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
45c0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
45d0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
45e0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
45f0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
4600: 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20  Size = nSize;.  
4610: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4620: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
4630: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
4640: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
4650: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
4660: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
4670: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
4680: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
4690: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
46a0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
46b0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
46c0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
46d0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
46e0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
46f0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
4700: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
4710: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
4720: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
4730: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
4740: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
4750: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
4760: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
4770: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
4780: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
4790: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
47a0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
47b0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
47c0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
47d0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
47e0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
47f0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
4800: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
4810: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4820: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4830: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
4840: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
4850: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
4860: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
4870: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
4880: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
4890: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
48a0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
48b0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
48c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
48d0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
48e0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
48f0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
4900: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
4910: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
4920: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
4930: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
4940: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
4950: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
4960: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
4970: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
4980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4990: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
49a0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
49b0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
49c0: 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e  erflow = pInfo->
49d0: 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20  nLocal + n;.    
49e0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
49f0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4a00: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
4a10: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
4a20: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4a30: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
4a40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
4a50: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
4a60: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
4a70: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
4a80: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4a90: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
4aa0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
4ab0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
4ac0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
4ad0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4af0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
4b00: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
4b10: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
4b20: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
4b30: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
4b40: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
4b50: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4b60: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
4b70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
4b80: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
4b90: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
4ba0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
4bb0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
4bc0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
4bd0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
4be0: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
4bf0: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
4c00: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
4c10: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
4c20: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
4c30: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
4c40: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
4c50: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
4c60: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  inter..*/.#ifnde
4c70: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
4c80: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
4c90: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
4ca0: 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49   iCell){.  CellI
4cb0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4cc0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4cd0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4ce0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4cf0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
4d00: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31 36  endif.static u16
4d10: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
4d20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
4d30: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
4d40: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69  nfo info;.  sqli
4d50: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4d60: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4d70: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
4d80: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
4d90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4da0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
4db0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
4dc0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
4dd0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
4de0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
4df0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
4e00: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
4e10: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
4e20: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
4e30: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
4e40: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
4e50: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f  c int ptrmapPutO
4e60: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
4e70: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
4e80: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
4e90: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  fo;.  assert( pC
4ea0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ell!=0 );.  sqli
4eb0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4ec0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4ed0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
4ee0: 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
4ef0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
4f00: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
4f10: 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
4f20: 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
4f30: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
4f40: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
4f50: 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
4f60: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
4f70: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
4f80: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
4f90: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
4fa0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
4fb0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
4fc0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
4fd0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
4fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4ff0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
5000: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
5010: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
5020: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
5030: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
5040: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
5050: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
5060: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
5070: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
5080: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
5090: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
50a0: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
50b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
50c0: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
50d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
50e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
50f0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5100: 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   );.  pCell = fi
5110: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
5120: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Page, iCell);.  
5130: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
5140: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
5150: 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Cell);.}.#endif.
5160: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
5170: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
5180: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
5190: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
51a0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
51b0: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
51c0: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
51d0: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
51e0: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
51f0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
5200: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
5210: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
5220: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
5230: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
5240: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5250: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
5260: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
5270: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5290: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
52a0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52c0: 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68  ddress of a i-th
52d0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61   cell */.  int a
52e0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
52f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5300: 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66  of first byte af
5310: 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ter cell pointer
5320: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
5330: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
5340: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5350: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
5360: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
5370: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5380: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
5390: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
53a0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
53b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
53c0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
53d0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
53e0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
53f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
5400: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
5410: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
5420: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5440: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
5450: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
5460: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
5490: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
54a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
54b0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
54c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
54d0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
54e0: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
54f0: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
5500: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
5510: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
5520: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
5530: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
5540: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
5550: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
5560: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
5570: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
5580: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
5590: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
55a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
55b0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
55c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
55d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
55e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
55f0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
5600: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
5610: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
5620: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
5630: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
5640: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
5650: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
5660: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
5670: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
5680: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
5690: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
56a0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
56b0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
56c0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
56d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
56e0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
56f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
5700: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
5710: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
5720: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
5730: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
5740: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
5750: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
5760: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
5770: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
5780: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
5790: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
57a0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
57b0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
57c0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
57d0: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28  (pAddr);.    if(
57e0: 20 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20   pc>=usableSize 
57f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5800: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5810: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  KPT;.    }.    s
5820: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
5830: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
5840: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
5850: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
5860: 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32  brk<cellOffset+2
5870: 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a  *nCell || pc+siz
5880: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
5890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
58a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
58b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
58c0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
58d0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
58e0: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63  k>=0 );.    memc
58f0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
5900: 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29  &temp[pc], size)
5910: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
5920: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d  Addr, cbrk);.  }
5930: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
5940: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
5950: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
5960: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
5970: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
5980: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
5990: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
59a0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
59b0: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
59c0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
59d0: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
59e0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29  ], 0, cbrk-addr)
59f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5a00: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
5a10: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
5a20: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
5a30: 6b 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e  k-addr!=pPage->n
5a40: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
5a50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
5a60: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
5a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
5a90: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
5aa0: 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65   space on a page
5ab0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5ac0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
5ad0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20  age->aData[] of 
5ae0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
5af0: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c  f.** the new all
5b00: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61  ocation.  The ca
5b10: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
5b20: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
5b30: 6f 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20  ough.** space.  
5b40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
5b50: 6c 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a  l never fail..**
5b60: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
5b70: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
5b80: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
5b90: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
5ba0: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
5bb0: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
5bc0: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
5bd0: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
5be0: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
5bf0: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
5c00: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
5c10: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
5c20: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
5c30: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
5c40: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
5c50: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
5c60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5c70: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
5c80: 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72  nt addr, pc, hdr
5c90: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
5ca0: 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74  int nFrag;.  int
5cb0: 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   top;.  int nCel
5cc0: 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  l;.  int cellOff
5cd0: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
5ce0: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20  char *data;.  . 
5cf0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5d00: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
5d10: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5d20: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5d30: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5d40: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
5d50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5d60: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5d70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5d80: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5d90: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
5da0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
5db0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
5dc0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
5dd0: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
5de0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
5df0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50  rflow==0 );.  pP
5e00: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
5e10: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
5e20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
5e30: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
5e40: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
5e50: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
5e60: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
5e70: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
5e80: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
5e90: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5ea0: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5eb0: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
5ec0: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
5ed0: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
5ee0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5ef0: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
5f00: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
5f10: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5f20: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5f30: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
5f40: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
5f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5f60: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
5f70: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
5f80: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
5f90: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5fa0: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5fb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5fc0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5fd0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
5fe0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
5ff0: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
6000: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
6010: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
6020: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6030: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
6040: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
6050: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
6060: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
6070: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
6080: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
6090: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
60a0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
60b0: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
60c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
60d0: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
60e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
60f0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
6100: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
6110: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
6120: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
6130: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
6140: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
6150: 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67  te ){.    defrag
6160: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
6170: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
6180: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
6190: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
61a0: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
61b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
61c0: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
61d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
61e0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
61f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6200: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
6210: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
6220: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70   );.  return top
6230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6240: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
6250: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
6260: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
6270: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
6280: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
6290: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
62a0: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
62b0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
62c0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
62d0: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
62e0: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
62f0: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
6300: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
6310: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
6320: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
6330: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
6340: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
6350: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
6360: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
6370: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
6380: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
6390: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
63a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
63b0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
63c0: 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72  >aData;..  asser
63d0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
63e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
63f0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
6400: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
6410: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6420: 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d  t( start>=pPage-
6430: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50  >hdrOffset+6+(pP
6440: 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29  age->leaf?0:4) )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61  ;.  assert( (sta
6460: 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67  rt + size)<=pPag
6470: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6480: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
6490: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
64a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
64b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
64c0: 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20  t( size>=0 );   
64d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
64e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69  size is 4 */..#i
64f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
6500: 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f  RE_DELETE.  /* O
6510: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
6520: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
6530: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
6540: 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a   SECURE_DELETE .
6550: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
6560: 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
6570: 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73  e-time */.  mems
6580: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
6590: 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69   0, size);.#endi
65a0: 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
65b0: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
65c0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
65d0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f  of freeblocks */
65e0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
65f0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
6600: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
6610: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
6620: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
6630: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
6640: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
6650: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
6660: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6670: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
6680: 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72  if( pbegin<=addr
6690: 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
66a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
66b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
66c0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
66d0: 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69    }.  if ( pbegi
66e0: 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  n>pPage->pBt->us
66f0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20  ableSize-4 ) {. 
6700: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6710: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6720: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
6730: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
6740: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
6750: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
6760: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
6770: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
6780: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
6790: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
67a0: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
67b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73  Page->nFree += s
67c0: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
67d0: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
67e0: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
67f0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
6800: 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69  ffset + 1;.  whi
6810: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
6820: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
6830: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
6840: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a  t pnext, psize;.
6850: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6860: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
6870: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6880: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6890: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
68a0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
68b0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
68c0: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
68d0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
68e0: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
68f0: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
6900: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
6910: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
6920: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
6930: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
6940: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
6950: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 64 61  g<0) || (frag>da
6960: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
6970: 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20  set+7]) ){.     
6980: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6990: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
69a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74       }.      dat
69b0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
69c0: 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20  et+7] -= frag;. 
69d0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
69e0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74  ata[pbegin], get
69f0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
6a00: 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32  t]));.      put2
6a10: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6a20: 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32  n+2], pnext+get2
6a30: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
6a40: 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20  +2])-pbegin);.  
6a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6a60: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6a70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6a80: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6a90: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
6aa0: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
6ab0: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
6ac0: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
6ad0: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
6ae0: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
6af0: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
6b00: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
6b10: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6b20: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
6b30: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
6b40: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
6b50: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
6b60: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6b70: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
6b80: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
6b90: 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74  dr+5], top + get
6ba0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6bb0: 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 61  in+2]));.  }.  a
6bc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6bd0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6be0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6bf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6c00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6c10: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
6c20: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
6c30: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
6c40: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
6c50: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
6c60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
6c70: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
6c80: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
6c90: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
6ca0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
6cb0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
6cc0: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
6cd0: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
6ce0: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
6cf0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
6d00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6d10: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
6d20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
6d30: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
6d40: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
6d50: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
6d60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6d70: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6d80: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
6d90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6da0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
6db0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
6dc0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
6dd0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
6de0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
6df0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
6e00: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
6e10: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
6e20: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
6e30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6e40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6e50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6e60: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
6e70: 3e 6c 65 61 66 20 3d 20 66 6c 61 67 42 79 74 65  >leaf = flagByte
6e80: 3e 3e 33 3b 20 20 61 73 73 65 72 74 28 20 50 54  >>3;  assert( PT
6e90: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
6ea0: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
6eb0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
6ec0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
6ed0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
6ee0: 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  af;.  pBt = pPag
6ef0: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
6f00: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
6f10: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
6f20: 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  EY) ){.    pPage
6f30: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
6f40: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
6f50: 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   = pPage->leaf;.
6f60: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
6f70: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
6f80: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
6f90: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
6fa0: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
6fb0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
6fc0: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
6fd0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6fe0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
6ff0: 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  hasData = 0;.   
7000: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
7010: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
7020: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
7030: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
7040: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
7050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7060: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7080: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7090: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
70a0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
70b0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
70c0: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
70d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
70e0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
70f0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
7100: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
7110: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
7120: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
7130: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
7140: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
7150: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
7160: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
7170: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
7180: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
7190: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
71a0: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
71b0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
71c0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
71d0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
71e0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
71f0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
7200: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
7210: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
7220: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
7230: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7240: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7250: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7260: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7270: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
7280: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
7290: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
72a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72b0: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
72c0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
72d0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
72e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
72f0: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
7300: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
7310: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
7320: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
7330: 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  nit ){.    int p
7340: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
7350: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
7360: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
7370: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
7380: 0a 20 20 20 20 69 6e 74 20 68 64 72 3b 20 20 20  .    int hdr;   
7390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
73a0: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
73b0: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
73c0: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
73d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
73e0: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
73f0: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
7400: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
7410: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
7420: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7430: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
7440: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
7450: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
7460: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
7470: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
7480: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
7490: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
74a0: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
74b0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
74c0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
74d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
74e0: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
74f0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
7500: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
7510: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
7520: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
7530: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20  ent area */..   
7540: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
7550: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
7560: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7570: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
7580: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
7590: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
75a0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
75b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
75c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
75d0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
75e0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
75f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32  Bt->pageSize<=32
7600: 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65  768 );.    pPage
7610: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
7620: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
7630: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
7640: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
7650: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
7660: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
7670: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
7680: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
7690: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
76a0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74  age->leaf;.    t
76b0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
76c0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
76d0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
76e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
76f0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
7700: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
7710: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
7720: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
7730: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
7740: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
7750: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
7760: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7780: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  BKPT;.    }.  . 
7790: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
77a0: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
77b0: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
77c0: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
77d0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
77e0: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
77f0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
7800: 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b   - (cellOffset +
7810: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29   2*pPage->nCell)
7820: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
7830: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
7840: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
7850: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
7860: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ze-4 ){.        
7870: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
7880: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
7890: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
78a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
78b0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
78c0: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
78d0: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
78e0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
78f0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
7900: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ]);.      if( ne
7910: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
7920: 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20  +size+3 ){.     
7930: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
7940: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
7950: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
7960: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
7970: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7980: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
7990: 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65     nFree += size
79a0: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
79b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  t;.    }.    pPa
79c0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
79d0: 65 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  e;.    if( nFree
79e0: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
79f0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70        /* Free sp
7a00: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
7a10: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
7a20: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
7a30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7a40: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 0a 23  _BKPT; .    }..#
7a50: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
7a60: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
7a70: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
7a80: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
7a90: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
7aa0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
7ab0: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
7ac0: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
7ad0: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
7ae0: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
7af0: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
7b00: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
7b10: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
7b20: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
7b30: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
7b40: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
7b50: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
7b60: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
7b70: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
7b80: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
7b90: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
7ba0: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
7bb0: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
7bc0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
7bd0: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
7be0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
7bf0: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
7c00: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
7c10: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
7c20: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
7c30: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
7c40: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
7c50: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
7c60: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
7c70: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
7c80: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
7c90: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
7ca0: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
7cb0: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
7cc0: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
7cd0: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
7ce0: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
7cf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7d00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7d10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
7d20: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
7d30: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
7d40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7d50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
7d60: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
7d70: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
7d80: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
7d90: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
7da0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
7db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
7dc0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
7dd0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
7de0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
7df0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
7e00: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
7e10: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
7e20: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20  >pBt;.  int hdr 
7e30: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
7e40: 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b  et;.  int first;
7e50: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7e60: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
7e70: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
7e80: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
7e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7ea0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7eb0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
7ec0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
7ed0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
7ee0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7ef0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
7f00: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
7f10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7f20: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
7f30: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7f40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7f50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7f60: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7f70: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
7f80: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
7f90: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
7fa0: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
7fb0: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
7fc0: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
7fd0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
7fe0: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
7ff0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
8000: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
8010: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
8020: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
8030: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
8040: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
8050: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
8060: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
8070: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
8080: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
8090: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
80a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
80b0: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
80c0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
80d0: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
80e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
80f0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
8100: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
8110: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
8120: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
8130: 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   - 1;.  pPage->n
8140: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
8150: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
8160: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
8170: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
8180: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
8190: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
81a0: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
81b0: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
81c0: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
81d0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
81e0: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
81f0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
8200: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
8210: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8220: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
8230: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8240: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
8250: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
8260: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8270: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
8280: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
8290: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
82a0: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
82b0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
82c0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
82d0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
82e0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
82f0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
8300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
8310: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
8320: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
8330: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
8340: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
8350: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
8360: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
8370: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
8380: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
8390: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
83a0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
83b0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
83c0: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
83d0: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
83e0: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
83f0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
8400: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
8410: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
8420: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
8430: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
8440: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
8450: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
8460: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
8470: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
8480: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
8490: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
84a0: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
84b0: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
84c0: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
84d0: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
84e0: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
84f0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
8500: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
8510: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
8520: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
8530: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
8540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
8550: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
8560: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
8570: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
8580: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
8590: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
85a0: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
85b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
85c0: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
85d0: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
85e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
85f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
8600: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8610: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8620: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
8630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
8640: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
8650: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
8660: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
8670: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
8680: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8690: 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
86a0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
86b0: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
86c0: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
86d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
86e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
86f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
8700: 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
8710: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
8720: 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
8730: 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
8740: 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
8750: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 61 67  .static Pgno pag
8760: 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  erPagecount(BtSh
8770: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
8780: 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  t nPage = -1;.  
8790: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
87a0: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 3b  ( pBt->pPage1 );
87b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
87c0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
87d0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
87e0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  e);.  assert( rc
87f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  ==SQLITE_OK || n
8800: 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65  Page==-1 );.  re
8810: 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65  turn (Pgno)nPage
8820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
8830: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
8840: 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
8850: 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ize it.  This ro
8860: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74  utine.** is just
8870: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77   a convenience w
8880: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65  rapper around se
8890: 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a  parate calls to.
88a0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ** sqlite3BtreeG
88b0: 65 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c  etPage() and sql
88c0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
88d0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
88e0: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
88f0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
8900: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
8910: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
8920: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8930: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
8940: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
8950: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
8960: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20  mPage **ppPage  
8970: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
8980: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
8990: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
89a0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
89b0: 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
89c0: 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
89d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
89e0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
89f0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
8a00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8a10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8a20: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KPT; .  }..  /* 
8a30: 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20  It is often the 
8a40: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61  case that the pa
8a50: 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c  ge we want is al
8a60: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a  ready in cache..
8a70: 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20    ** If so, get 
8a80: 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  it directly.  Th
8a90: 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d  is saves us from
8aa0: 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a   having to call.
8ab0: 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f    ** pagerPageco
8ac0: 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  unt() to make su
8ad0: 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69  re pgno is withi
8ae0: 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20  n limits, which 
8af0: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20  results.  ** in 
8b00: 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65  a measureable pe
8b10: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
8b20: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
8b30: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
8b40: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
8b50: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
8b60: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
8b70: 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20  .    /* Page is 
8b80: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
8b90: 20 2a 2f 0a 20 20 20 20 2a 70 70 50 61 67 65 20   */.    *ppPage 
8ba0: 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  = pPage = btreeP
8bb0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
8bc0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
8bd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
8be0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
8bf0: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20      /* Page not 
8c00: 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69  in cache.  Acqui
8c10: 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  re it. */.    if
8c20: 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
8c30: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
8c40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c50: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
8c60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
8c70: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8c80: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
8c90: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
8ca0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8cb0: 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a  c;.    pPage = *
8cc0: 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  ppPage;.  }.  if
8cd0: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
8ce0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8cf0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8d00: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
8d10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8d20: 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
8d30: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
8d40: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
8d50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8d60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
8d70: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
8d80: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
8d90: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
8da0: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
8db0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8dc0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
8dd0: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
8de0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
8df0: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
8e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8e10: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
8e20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8e30: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
8e40: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
8e50: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
8e60: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
8e70: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
8e80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
8e90: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
8ea0: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
8eb0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
8ec0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8ed0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8ee0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8f00: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
8f10: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
8f20: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
8f30: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
8f40: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
8f50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
8f60: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
8f70: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
8f80: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
8f90: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
8fa0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8fb0: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
8fc0: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
8fd0: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
8fe0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8ff0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
9000: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
9010: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
9020: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
9030: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
9040: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
9050: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
9060: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
9070: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
9080: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
9090: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
90a0: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
90b0: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
90c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
90d0: 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ata);.  if( pPag
90e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
90f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9100: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9110: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9120: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
9130: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
9140: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
9150: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
9160: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
9170: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
9180: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
9190: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
91a0: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
91b0: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
91c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
91d0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
91e0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
91f0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
9200: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
9210: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
9220: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
9230: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9240: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
9250: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
9260: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
9270: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
9280: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
9290: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
92a0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
92b0: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
92c0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
92d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
92e0: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
92f0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
9300: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77  a new database w
9310: 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d  ith a random nam
9320: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
9330: 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d  his randomly nam
9340: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ed.** database f
9350: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
9360: 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ted when sqlite3
9370: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
9380: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46  called..** If zF
9390: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
93a0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
93b0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
93c0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
93d0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
93e0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
93f0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
9400: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9410: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e  BtreeOpen(.  con
9420: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
9430: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
9440: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
9450: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
9460: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
9470: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9480: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
9490: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
94a0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
94b0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
94c0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
94d0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
94e0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
94f0: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
9500: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
9510: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
9520: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
9530: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
9540: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
9550: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
9560: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
9570: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
9580: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
9590: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
95a0: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
95b0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Bt = 0;      /* 
95c0: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
95d0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
95e0: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
9600: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
9610: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
9620: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
9630: 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67  Reserve;.  unsig
9640: 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
9650: 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53  er[100];..  /* S
9660: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
9670: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
9680: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
9690: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
96a0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
96b0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
96c0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
96d0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
96e0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
96f0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
9700: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
9710: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
9720: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
9730: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
9740: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
9750: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
9760: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
9770: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9780: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
9790: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
97a0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
97b0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
97c0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
97d0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
97e0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
97f0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
9800: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
9810: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
9820: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
9830: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
9840: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9850: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
9860: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
9870: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
9880: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
9890: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
98a0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
98b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
98c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
98d0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
98e0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
98f0: 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  b;..#if !defined
9900: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9910: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
9920: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9930: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
9940: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
9950: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
9960: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
9970: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
9980: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
9990: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
99a0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
99b0: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
99c0: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20  f( isMemdb==0.  
99d0: 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
99e0: 20 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30   SQLITE_Vtab)==0
99f0: 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  .   && zFilename
9a00: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
9a10: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  .  ){.    if( sq
9a20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9a30: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
9a40: 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  bled ){.      in
9a50: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
9a60: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
9a70: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
9a80: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
9a90: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
9aa0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
9ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9ac0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
9ad0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
9ae0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ble = 1;.      d
9af0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
9b00: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
9b10: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
9b20: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
9b30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b40: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
9b50: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9b70: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
9b80: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
9b90: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
9ba0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
9bb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
9bc0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
9bd0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
9be0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9bf0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
9c00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9c10: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
9c20: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
9c30: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
9c40: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
9c50: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
9c60: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
9c70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9c80: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
9c90: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
9ca0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
9cb0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
9cc0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
9cd0: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
9ce0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
9cf0: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
9d00: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
9d10: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
9d20: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
9d30: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
9d40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9d50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d60: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
9d70: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
9d80: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
9d90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
9da0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
9db0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9dc0: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
9dd0: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
9de0: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
9df0: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
9e00: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
9e10: 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
9e20: 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
9e30: 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
9e40: 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
9e50: 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
9e60: 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
9e70: 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
9e80: 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
9e90: 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
9ea0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
9eb0: 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
9ec0: 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
9ed0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
9ee0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
9ef0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
9f00: 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
9f10: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
9f20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9f30: 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
9f40: 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
9f50: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
9f60: 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
9f70: 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
9f80: 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
9f90: 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
9fa0: 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
9fb0: 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
9fc0: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
9fd0: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
9fe0: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
9ff0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
a000: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
a010: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
a020: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
a030: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
a040: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
a050: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
a060: 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
a070: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
a080: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
a090: 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
a0a0: 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
a0b0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
a0c0: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
a0d0: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
a0e0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
a0f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a100: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
a110: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
a120: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a130: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
a140: 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
a150: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
a180: 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
a190: 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  s);.    if( rc==
a1a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a1b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
a1c0: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
a1d0: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
a1e0: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
a1f0: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
a200: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
a210: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a220: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
a230: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
a240: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
a250: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
a260: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
a270: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
a280: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
a290: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
a2a0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
a2b0: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
a2c0: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
a2d0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  ;.    pBt->pCurs
a2e0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
a2f0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
a300: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
a310: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
a320: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
a330: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
a340: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
a350: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
a360: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
a370: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
a380: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
a390: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a3a0: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
a3b0: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
a3c0: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
a3d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
a3e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
a3f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
a400: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
a410: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
a420: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66  ->pageSize);.#if
a430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a440: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
a450: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
a460: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
a470: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
a480: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
a490: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
a4a0: 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
a4b0: 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
a4c0: 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
a4d0: 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
a4e0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
a4f0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
a500: 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
a510: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
a520: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
a530: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
a540: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
a550: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
a560: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
a570: 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
a580: 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
a590: 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
a5a0: 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
a5b0: 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
a5c0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
a5d0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
a5e0: 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
a5f0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
a600: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
a610: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
a620: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
a630: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
a640: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
a650: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
a660: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
a670: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
a680: 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
a690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
a6a0: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
a6b0: 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
a6c0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
a6d0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
a6e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a6f0: 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
a700: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
a710: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
a720: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
a730: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
a740: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
a750: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
a760: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
a770: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
a780: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
a790: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
a7a0: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
a7b0: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
a7c0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
a7d0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
a7e0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
a7f0: 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ize */.    sqlit
a800: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
a810: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
a820: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
a830: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
a840: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a850: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
a860: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a870: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
a880: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
a890: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
a8a0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
a8b0: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
a8c0: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
a8d0: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
a8e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a8f0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
a900: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
a910: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
a920: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
a930: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a940: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
a950: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
a960: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
a970: 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
a980: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
a990: 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
a9a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
a9b0: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
a9c0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
a9d0: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
a9e0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
a9f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
aa00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
aa10: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
aa20: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
aa30: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
aa40: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
aa50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
aa60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
aa70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
aa80: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
aa90: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
aaa0: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
aab0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
aac0: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
aad0: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
aae0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
aaf0: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
ab00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ab10: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
ab20: 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
ab30: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
ab40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ab50: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
ab60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
ab70: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
ab80: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
ab90: 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
aba0: 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
abb0: 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
abc0: 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
abd0: 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
abe0: 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
abf0: 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
ac00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
ac10: 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
ac20: 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
ac30: 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
ac40: 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
ac50: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
ac60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
ac70: 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
ac80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
ac90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
aca0: 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
acb0: 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
acc0: 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
acd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
ace0: 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
acf0: 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
ad00: 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
ad10: 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
ad20: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
ad30: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
ad40: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
ad50: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
ad60: 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
ad70: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
ad80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
ad90: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
ada0: 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
adb0: 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
add0: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
ade0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
adf0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
ae00: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
ae10: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
ae20: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
ae30: 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
ae40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
ae50: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
ae60: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
ae70: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
ae80: 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
ae90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
aea0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aeb0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
aec0: 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
aed0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
aee0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
aef0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
af00: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
af10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
af20: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
af30: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
af40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
af50: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
af60: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
af70: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
af80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
af90: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
afa0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
afb0: 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
afc0: 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
afd0: 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
afe0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
aff0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
b000: 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
b010: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
b020: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
b030: 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
b040: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
b050: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
b060: 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
b070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b080: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
b090: 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
b0a0: 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
b0b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
b0c0: 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33  _CACHE.  sqlite3
b0d0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
b0e0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
b0f0: 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
b100: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
b110: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b120: 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
b130: 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72  ex) );.  pMaster
b140: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
b150: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
b160: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
b170: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
b180: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
b190: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
b1a0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
b1b0: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
b1c0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
b1d0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
b1e0: 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
b1f0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
b200: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
b210: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
b220: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
b230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
b240: 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
b250: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
b260: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
b270: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
b280: 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
b290: 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
b2a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
b2b0: 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
b2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b2d0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
b2e0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
b2f0: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
b300: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
b310: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
b320: 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
b330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
b340: 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
b350: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
b360: 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
b370: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b380: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
b390: 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
b3a0: 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
b3b0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
b3c0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
b3d0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
b3e0: 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
b3f0: 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
b400: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
b410: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
b420: 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
b430: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
b440: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
b450: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
b460: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
b470: 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
b480: 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
b490: 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
b4a0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
b4b0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
b4c0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
b4d0: 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
b4e0: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
b4f0: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
b500: 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
b510: 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
b520: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
b530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
b540: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
b550: 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
b560: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
b570: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
b580: 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
b590: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b5a0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
b5b0: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
b5c0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
b5d0: 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
b5e0: 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
b5f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b600: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
b610: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
b620: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
b630: 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
b640: 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20  = p->db;.  pCur 
b650: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
b660: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
b670: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
b680: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
b690: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
b6a0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
b6b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
b6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
b6d0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
b6e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
b6f0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
b700: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
b710: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
b720: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
b730: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
b740: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
b750: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
b760: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
b770: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
b780: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
b790: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
b7a0: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
b7b0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
b7c0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
b7d0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
b7e0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
b7f0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
b800: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
b810: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
b820: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
b830: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
b840: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
b850: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
b860: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
b870: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
b880: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
b890: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
b8a0: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
b8b0: 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
b8c0: 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
b8d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
b8e0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
b8f0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
b900: 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
b910: 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
b920: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
b930: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
b940: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
b950: 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
b960: 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
b970: 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
b980: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
b990: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
b9a0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
b9b0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
b9c0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
b9d0: 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
b9e0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
b9f0: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
ba00: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
ba10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ba20: 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53  te3_free(pBt->pS
ba30: 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
ba40: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
ba50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ba60: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
ba70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ba80: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
ba90: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
baa0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
bab0: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
bac0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
bad0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
bae0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
baf0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
bb00: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
bb10: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
bb20: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
bb30: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
bb40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bb50: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
bb60: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
bb70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
bb80: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
bb90: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
bba0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
bbb0: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
bbc0: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
bbd0: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
bbe0: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
bbf0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
bc00: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
bc10: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
bc20: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
bc30: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
bc40: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
bc50: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
bc60: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
bc70: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
bc80: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
bc90: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
bca0: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
bcb0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
bcc0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
bcd0: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
bce0: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
bcf0: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
bd00: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
bd10: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
bd20: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
bd30: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
bd40: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
bd50: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
bd60: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
bd70: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
bd80: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
bd90: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
bda0: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
bdb0: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
bdc0: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
bdd0: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
bde0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
bdf0: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
be00: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
be10: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
be20: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
be30: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
be40: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
be50: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
be60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
be70: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
be80: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
be90: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
bea0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
beb0: 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
bec0: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
bed0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
bee0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
bef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bf00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
bf10: 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
bf20: 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
bf30: 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
bf40: 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
bf50: 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
bf60: 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
bf70: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
bf80: 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
bf90: 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
bfa0: 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
bfb0: 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
bfc0: 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
bfd0: 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
bfe0: 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
bff0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
c000: 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
c010: 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
c020: 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
c030: 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
c040: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
c050: 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
c060: 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
c070: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
c080: 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
c090: 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
c0a0: 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
c0b0: 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
c0c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c0d0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
c0e0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
c0f0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
c100: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
c110: 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
c120: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
c130: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
c140: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c150: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
c160: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
c170: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c180: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
c190: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
c1a0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
c1b0: 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
c1c0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c1d0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
c1e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
c1f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
c200: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
c210: 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
c220: 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
c230: 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
c240: 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
c250: 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
c260: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
c270: 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
c280: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
c290: 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
c2a0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
c2b0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
c2c0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
c2d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c2e0: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
c2f0: 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
c300: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c310: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
c320: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
c330: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
c340: 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
c350: 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
c360: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c370: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
c390: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
c3a0: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
c3b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c3c0: 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
c3d0: 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
c3e0: 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
c3f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c400: 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
c410: 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r page..**.** Th
c420: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
c430: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
c440: 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
c450: 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
c460: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
c470: 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
c480: 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
c490: 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
c4a0: 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
c4b0: 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
c4c0: 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
c4d0: 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
c4e0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
c4f0: 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
c500: 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
c510: 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
c520: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
c530: 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
c540: 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
c550: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
c560: 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
c570: 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
c580: 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
c590: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
c5a0: 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
c5b0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
c5c0: 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
c5d0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
c5e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
c5f0: 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
c600: 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
c610: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
c620: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
c630: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
c640: 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
c650: 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
c660: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c670: 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
c680: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
c690: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c6a0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
c6b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c6c0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
c6d0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c6e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c6f0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
c700: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
c710: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
c720: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c730: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
c740: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
c750: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
c760: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
c770: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
c780: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
c790: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
c7a0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
c7b0: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
c7c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
c7d0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
c7e0: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
c7f0: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
c800: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
c810: 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
c820: 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  ace(pBt);.    rc
c830: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
c840: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
c850: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
c860: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  geSize);.  }.  p
c870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c880: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c890: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c   nReserve;.  sql
c8a0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
c8b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c8d0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
c8e0: 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
c8f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c900: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
c910: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
c920: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
c930: 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ize;.}.int sqlit
c940: 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
c950: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
c960: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
c970: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c980: 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
c990: 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
c9a0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
c9b0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
c9c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
c9d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c9e0: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
c9f0: 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
ca00: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
ca10: 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
ca20: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
ca30: 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
ca40: 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
ca50: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
ca60: 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
ca70: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
ca80: 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
ca90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
caa0: 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
cab0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
cac0: 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
cad0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
cae0: 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
caf0: 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
cb00: 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
cb10: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
cb20: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
cb30: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
cb40: 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n n;.}.#endif /*
cb50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cb60: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
cb70: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
cb80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
cb90: 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
cba0: 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
cbb0: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
cbc0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
cbd0: 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
cbe0: 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
cbf0: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
cc00: 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
cc10: 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
cc20: 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
cc30: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
cc40: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
cc50: 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
cc60: 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
cc70: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
cc80: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
cc90: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
cca0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
ccb0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
ccc0: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
ccd0: 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
cce0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
ccf0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
cd00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cd10: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
cd20: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
cd30: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
cd40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cd50: 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74  .  int av = (aut
cd60: 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20  oVacuum?1:0);.. 
cd70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
cd80: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
cd90: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
cda0: 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f  && av!=pBt->auto
cdb0: 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
cdc0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
cdd0: 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
cde0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
cdf0: 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c   = av;.  }.  sql
ce00: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ce10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ce20: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
ce30: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
ce40: 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
ce50: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
ce60: 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
ce70: 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
ce80: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
ce90: 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
cea0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ceb0: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
cec0: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
ced0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
cee0: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
cef0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
cf00: 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
cf10: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
cf20: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
cf30: 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
cf40: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
cf50: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
cf60: 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
cf70: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
cf80: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
cf90: 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
cfa0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
cfb0: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
cfc0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
cfd0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
cfe0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
cff0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
d000: 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
d010: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
d020: 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
d030: 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
d040: 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
d050: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
d060: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
d070: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
d080: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
d090: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
d0a0: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
d0b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d0c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
d0d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
d0e0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
d0f0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
d100: 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
d110: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
d120: 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
d130: 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
d140: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
d150: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
d160: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
d170: 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
d180: 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
d190: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d1a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d1b0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
d1c0: 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74  Bt->pPage1 ) ret
d1d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d1e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d1f0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
d200: 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
d210: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d220: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
d230: 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
d240: 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
d250: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
d260: 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
d270: 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
d280: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
d290: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d2a0: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
d2b0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
d2c0: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
d2d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d2e0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d2f0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
d300: 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
d310: 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
d320: 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
d330: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
d340: 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
d350: 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
d360: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
d370: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
d380: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
d390: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
d3a0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d3b0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d3c0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
d3d0: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
d3e0: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
d3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d400: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
d410: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d420: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d430: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
d440: 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
d450: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
d460: 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
d470: 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
d480: 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
d490: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
d4a0: 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
d4b0: 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
d4c0: 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
d4d0: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
d4e0: 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
d4f0: 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
d500: 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
d510: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
d520: 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
d530: 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
d540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d550: 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
d560: 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
d570: 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
d580: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d590: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d5a0: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
d5b0: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
d5c0: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
d5d0: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
d5e0: 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
d5f0: 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
d600: 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
d610: 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
d620: 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
d630: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
d640: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
d650: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d660: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
d670: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
d680: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
d690: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
d6a0: 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
d6b0: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
d6c0: 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
d6d0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
d6e0: 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
d6f0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
d700: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
d710: 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
d720: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
d730: 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
d740: 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
d750: 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
d760: 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
d770: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
d780: 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
d790: 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
d7a0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
d7b0: 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
d7c0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d7d0: 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
d7e0: 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
d7f0: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
d800: 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
d810: 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
d820: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d830: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
d840: 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
d850: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
d860: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
d870: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
d880: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
d890: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
d8a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d8b0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
d8c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
d8d0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
d8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d8f0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
d900: 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
d910: 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <500 ){.      go
d920: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d930: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
d940: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
d950: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
d960: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
d970: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
d980: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d990: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
d9a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
d9b0: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
d9c0: 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
d9d0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
d9e0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
d9f0: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
da00: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
da10: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
da20: 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
da30: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
da40: 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
da50: 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
da60: 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
da70: 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
da80: 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
da90: 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
daa0: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
dab0: 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
dac0: 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
dad0: 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
dae0: 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
daf0: 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
db00: 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
db10: 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
db20: 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
db30: 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
db40: 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
db50: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
db60: 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
db70: 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
db80: 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
db90: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
dba0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
dbb0: 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
dbc0: 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
dbd0: 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
dbe0: 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
dbf0: 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
dc00: 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
dc10: 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
dc20: 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
dc30: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
dc40: 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
dc50: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
dc60: 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
dc70: 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
dc80: 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
dc90: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
dca0: 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
dcb0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
dcc0: 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
dcd0: 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
dce0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
dcf0: 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
dd00: 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
dd10: 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
dd20: 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
dd30: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
dd40: 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
dd50: 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
dd60: 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
dd70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dd80: 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
dd90: 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
dda0: 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
ddb0: 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
ddc0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
ddd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
dde0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
ddf0: 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78  e lockBtree() ex
de00: 63 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73  cept that it als
de10: 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a  o invokes the.**
de20: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
de30: 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20  f there is lock 
de40: 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73  contention..*/.s
de50: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
de60: 72 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72  reeWithRetry(Btr
de70: 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74  ee *pRef){.  int
de80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
de90: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
dea0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
deb0: 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66  ex(pRef) );.  if
dec0: 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
ded0: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
dee0: 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
def0: 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
df00: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
df10: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
df20: 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
df30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
df40: 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
df50: 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
df60: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
df70: 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
df80: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
df90: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
dfa0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
dfb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dfc0: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
dfd0: 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
dfe0: 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
dff0: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
e000: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
e010: 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
e020: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
e030: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
e040: 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
e050: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
e060: 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
e070: 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
e080: 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
e090: 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
e0a0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
e0b0: 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
e0c0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
e0d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
e0e0: 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
e0f0: 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
e100: 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
e110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
e120: 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
e130: 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
e140: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e150: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
e160: 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
e170: 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
e180: 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
e190: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
e1a0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
e1b0: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
e1c0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
e1d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e1e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
e1f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
e200: 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
e210: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
e220: 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72   && pBt->pCursor
e230: 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ==0 && pBt->pPag
e240: 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  e1!=0 ){.    if(
e250: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
e260: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
e270: 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61  r)>=1 ){.      a
e280: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
e290: 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66  e1->aData );.#if
e2a0: 20 30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74   0.      if( pBt
e2b0: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d  ->pPage1->aData=
e2c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  =0 ){.        Me
e2d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
e2e0: 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
e2f0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
e300: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
e310: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
e320: 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
e330: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
e340: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
e350: 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20  >pgno = 1;.     
e360: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
e370: 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
e380: 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  >pPage1);.    }.
e390: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
e3a0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  = 0;.    pBt->in
e3b0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Stmt = 0;.  }.}.
e3c0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
e3d0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20  new database by 
e3e0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
e3f0: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
e400: 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73  he.** file..*/.s
e410: 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
e420: 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
e430: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
e440: 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
e450: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
e460: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61  nt rc;.  int nPa
e470: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
e480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
e4a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
e4b0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
e4c0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
e4d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
e4e0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65  LITE_OK || nPage
e4f0: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
e500: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d   rc;.  }.  pP1 =
e510: 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
e520: 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
e530: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
e540: 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
e550: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
e560: 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
e570: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e580: 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
e590: 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
e5a0: 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
e5b0: 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
e5c0: 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
e5d0: 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
e5e0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
e5f0: 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  16], pBt->pageSi
e600: 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ze);.  data[18] 
e610: 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
e620: 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  = 1;.  data[20] 
e630: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
e640: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
e650: 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  e;.  data[21] = 
e660: 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
e670: 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
e680: 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
e690: 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
e6a0: 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
e6b0: 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
e6c0: 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
e6d0: 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
e6e0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
e6f0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
e700: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
e710: 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
e720: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
e730: 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
e740: 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
e750: 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
e760: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
e770: 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
e780: 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
e790: 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
e7a0: 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
e7b0: 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
e7c0: 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
e7d0: 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
e7e0: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
e7f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
e800: 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
e810: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
e820: 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
e830: 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
e840: 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
e850: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
e860: 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
e870: 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
e880: 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
e890: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e8a0: 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
e8b0: 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
e8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
e8d0: 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
e8e0: 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
e8f0: 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
e900: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
e910: 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
e920: 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
e930: 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
e940: 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
e950: 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
e960: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
e970: 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
e980: 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
e990: 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
e9a0: 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
e9b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
e9c0: 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
e9d0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
e9e0: 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
e9f0: 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
ea00: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
ea10: 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
ea20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ea30: 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
ea40: 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
ea50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ea60: 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
ea70: 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
ea80: 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
ea90: 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
eaa0: 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
eab0: 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
eac0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
ead0: 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
eae0: 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
eaf0: 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
eb00: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
eb10: 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
eb20: 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
eb30: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
eb40: 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
eb50: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
eb60: 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
eb70: 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
eb80: 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
eb90: 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
eba0: 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
ebb0: 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
ebc0: 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
ebd0: 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
ebe0: 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
ebf0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
ec00: 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
ec10: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
ec20: 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
ec30: 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
ec40: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
ec50: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
ec60: 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
ec70: 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
ec80: 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
ec90: 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
eca0: 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
ecb0: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
ecc0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
ecd0: 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
ece0: 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
ecf0: 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
ed00: 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
ed10: 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
ed20: 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
ed30: 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
ed40: 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
ed50: 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
ed60: 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
ed70: 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
ed80: 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
ed90: 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
eda0: 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
edb0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
edc0: 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
edd0: 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
ede0: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
edf0: 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
ee00: 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
ee10: 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
ee20: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
ee30: 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
ee40: 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
ee50: 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
ee60: 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
ee70: 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
ee80: 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
ee90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
eea0: 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
eeb0: 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
eec0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
eed0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
eee0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eef0: 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
ef00: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
ef10: 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
ef20: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
ef30: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
ef40: 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
ef50: 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
ef60: 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
ef70: 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
ef80: 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
ef90: 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
efa0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
efb0: 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
efc0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
efd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
efe0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
eff0: 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
f000: 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
f010: 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
f020: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
f030: 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  un;.  }..  /* Wr
f040: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
f050: 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
f060: 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
f070: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
f080: 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
f090: 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
f0a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
f0b0: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
f0c0: 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
f0d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  }..  /* If anoth
f0e0: 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
f0f0: 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
f100: 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
f110: 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
f120: 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
f130: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
f140: 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
f150: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
f160: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
f170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
f180: 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
f190: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f1a0: 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
f1b0: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
f1c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
f1d0: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
f1e0: 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
f1f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f200: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
f210: 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
f220: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
f230: 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
f240: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
f250: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
f260: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f270: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
f280: 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
f290: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
f2a0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74  ;.        goto t
f2b0: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
f2c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
f2d0: 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  ndif..  do {.   
f2e0: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
f2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  ==0 ){.      do{
f300: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  .        rc = lo
f310: 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
f320: 20 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d      }while( pBt-
f330: 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63  >pPage1==0 && rc
f340: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
f350: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
f360: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
f370: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
f380: 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
f390: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f3a0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
f3b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f3c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f3d0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
f3e0: 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
f3f0: 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20  ge, wrflag>1);. 
f400: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
f410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f420: 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
f430: 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
f440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f450: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
f460: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f470: 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
f480: 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  g ) pBt->inStmt 
f490: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f4a0: 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
f4b0: 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
f4c0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
f4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
f4e0: 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
f4f0: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
f500: 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
f510: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f520: 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
f530: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f540: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
f550: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
f560: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
f570: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
f580: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  +;.    }.    p->
f590: 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
f5a0: 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
f5b0: 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
f5c0: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
f5d0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
f5e0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
f5f0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
f600: 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
f610: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f620: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f630: 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
f640: 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >1 ){.      asse
f650: 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75  rt( !pBt->pExclu
f660: 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42  sive );.      pB
f670: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20  t->pExclusive = 
f680: 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  p;.    }.#endif.
f690: 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
f6a0: 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  n:.  btreeIntegr
f6b0: 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
f6c0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
f6d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f6e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f6f0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
f700: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
f710: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
f720: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
f730: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
f740: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
f750: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
f760: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
f770: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
f780: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
f790: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
f7a0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
f7b0: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
f7c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
f7d0: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
f7e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
f7f0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
f820: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
f830: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
f860: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
f870: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f8a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
f8b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
f8c0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
f8d0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
f8e0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
f8f0: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
f900: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
f910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f920: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f930: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
f940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
f950: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
f960: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f970: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
f980: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f990: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
f9a0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
f9b0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
f9c0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
f9d0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f9e0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f9f0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
fa00: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
fa10: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
fa20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fa30: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
fa40: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
fa50: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
fa60: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
fa70: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
fa80: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
fa90: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
faa0: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
fab0: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
fac0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
fad0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
fae0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
faf0: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
fb00: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
fb10: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
fb20: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
fb30: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
fb40: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
fb50: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
fb60: 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
fb70: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
fb80: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
fb90: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
fba0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
fbb0: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
fbc0: 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
fbd0: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
fbe0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fbf0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
fc00: 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
fc10: 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
fc20: 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
fc30: 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
fc40: 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
fc50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
fc60: 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
fc70: 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
fc80: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
fc90: 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
fca0: 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
fcb0: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
fcc0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
fcd0: 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
fce0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
fcf0: 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
fd00: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
fd10: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
fd20: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
fd30: 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
fd40: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
fd50: 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
fd60: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
fd70: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
fd80: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
fd90: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
fda0: 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
fdc0: 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
fdd0: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
fde0: 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
fdf0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
fe00: 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
fe10: 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
fe20: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
fe30: 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
fe40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
fe50: 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
fe60: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
fe70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
fe80: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
fe90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
fea0: 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
feb0: 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
fec0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fed0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
fee0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
fef0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ff00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ff10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ff20: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
ff30: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
ff40: 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
ff50: 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
ff60: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
ff70: 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
ff80: 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
ff90: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
ffa0: 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
ffb0: 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
ffc0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ffd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ffe0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
fff0: 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
10000 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
10010 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
10020 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
10030 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
10040 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
10050 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10060 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
10070 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
10080 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
10090 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
100a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
100b0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
100c0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
100d0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
100e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
100f0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
10100 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
10110 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
10120 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
10130 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
10140 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
10150 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
10160 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
10170 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
10180 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
10190 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
101a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
101b0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
101c0 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
101d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
101e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
101f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
10200 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
10210 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
10220 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
10230 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
10240 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
10250 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10260 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10270 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
10280 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
10290 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
102a0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
102b0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
102c0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
102d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
102e0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
102f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10300 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
10310 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
10320 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
10330 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
10340 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
10350 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
10360 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
10370 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
10380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
10390 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
103a0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
103b0 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
103c0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
103d0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
103e0 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
103f0 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
10400 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  ns valid..*/.sta
10410 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
10420 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10430 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
10440 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
10450 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
10460 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
10470 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
10480 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
10490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
104a0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
104b0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
104c0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
104d0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
104e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
104f0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
10500 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
10510 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
10520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10530 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
10540 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
10550 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29    int isCommit.)
10560 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
10570 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
10580 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
10590 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
105a0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
105b0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
105c0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
105d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
105e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
105f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
10600 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
10610 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
10620 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
10630 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
10640 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
10650 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
10660 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
10670 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10680 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10690 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
106a0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
106b0 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
106c0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
106d0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
106e0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
106f0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
10700 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
10710 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
10720 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
10730 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
10740 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
10750 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
10760 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
10770 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
10780 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10790 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
107a0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
107b0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
107c0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
107d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
107e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
107f0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
10800 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
10810 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
10820 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
10830 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
10840 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
10850 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
10860 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
10870 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
10880 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
10890 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
108a0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
108b0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
108c0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
108d0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
108e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
108f0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
10900 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
10910 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
10920 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
10930 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
10940 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
10950 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
10960 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
10970 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
10980 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
10990 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
109a0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
109b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
109c0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
109d0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
109e0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
109f0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
10a00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10a20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10a30 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
10a40 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
10a50 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
10a60 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
10a70 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
10a80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
10a90 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
10aa0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
10ab0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
10ac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10b00 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
10b10 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
10b20 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
10b30 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
10b40 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
10b50 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
10b60 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
10b70 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
10b80 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
10b90 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
10ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
10bb0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
10bc0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
10bd0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
10be0 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
10bf0 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
10c00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10c30 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
10c40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
10c50 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
10c60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10c80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
10c90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
10ca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10cb0 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
10cc0 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
10cd0 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
10ce0 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
10cf0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10d00 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
10d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10d20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
10d30 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
10d40 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
10d50 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
10d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10d70 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
10d80 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
10d90 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
10da0 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
10db0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
10dc0 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
10dd0 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
10de0 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
10df0 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
10e00 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
10e10 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
10e20 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
10e30 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
10e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
10e50 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
10e60 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
10e70 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
10e80 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
10e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
10ea0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
10eb0 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
10ec0 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
10ed0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
10ee0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
10ef0 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
10f00 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
10f10 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
10f20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
10f30 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
10f40 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
10f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
10f60 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
10f70 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69   non-zero, the i
10f80 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
10f90 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
10fa0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
10fb0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
10fc0 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
10fd0 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
10fe0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
10ff0 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
11000 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
11010 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
11020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11030 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
11040 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
11050 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
11060 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
11070 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
11080 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
11090 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67  Pgno nFin){.  Pg
110a0 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20  no iLastPg;     
110b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
110c0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
110d0 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  base */.  Pgno n
110e0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
110f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11100 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
11110 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
11120 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11130 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11140 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11150 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e  iLastPg = pBt->n
11160 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61  Trunc;.  if( iLa
11170 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  stPg==0 ){.    i
11180 4c 61 73 74 50 67 20 3d 20 70 61 67 65 72 50 61  LastPg = pagerPa
11190 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
111a0 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
111b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
111c0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
111d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
111e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
111f0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
11200 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
11210 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
11220 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
11230 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11240 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
11250 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
11260 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
11270 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
11280 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
11290 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
112a0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
112b0 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
112c0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
112d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
112e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
112f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
11300 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
11310 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
11320 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11330 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11340 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
11350 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
11360 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
11370 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
11380 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
11390 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
113a0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
113b0 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
113c0 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
113d0 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
113e0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
113f0 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
11400 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
11410 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
11420 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
11430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11440 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
11450 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
11460 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
11470 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
11480 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
11490 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
114a0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
114b0 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
114c0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
114d0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
114e0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
114f0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
11500 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
11510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11530 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11540 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
11560 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
11570 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
11580 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
11590 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
115a0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
115b0 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
115c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
115d0 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
115e0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
115f0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
11600 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
11610 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11620 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
11630 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
11640 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
11650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11670 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
11680 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
11690 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
116a0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
116b0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
116c0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
116d0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
116e0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
116f0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
11700 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
11710 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
11720 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
11730 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
11740 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
11750 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
11760 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
11770 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
11780 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
11790 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
117a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
117b0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
117c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
117d0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
117e0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
117f0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
11800 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
11810 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
11820 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
11830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11850 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
11860 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
11870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
11890 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
118a0 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
118b0 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
118c0 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
118d0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
118e0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
118f0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
11900 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
11910 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
11920 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
11930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11940 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
11950 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
11960 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
11970 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
11980 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20  , nFin!=0);.    
11990 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
119a0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
119b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
119c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
119d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
119e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
119f0 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d  .  pBt->nTrunc =
11a00 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20   iLastPg - 1;.  
11a10 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75  while( pBt->nTru
11a20 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  nc==PENDING_BYTE
11a30 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
11a40 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
11a50 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20  Bt->nTrunc) ){. 
11a60 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d     pBt->nTrunc--
11a70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11a80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11a90 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
11aa0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
11ab0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
11ac0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
11ad0 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
11ae0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
11af0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
11b00 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
11b10 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
11b20 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
11b30 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
11b40 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
11b50 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
11b60 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
11b70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
11b80 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
11b90 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
11ba0 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c   occured,.** SQL
11bb0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11bc0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
11bd0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11be0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
11bf0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
11c00 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
11c10 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
11c20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11c30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11c40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
11c50 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
11c60 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
11c70 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
11c80 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
11c90 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
11ca0 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
11cb0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
11cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11cd0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
11ce0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
11cf0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11d00 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63  t);.    rc = inc
11d10 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
11d20 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
11d30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11d50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11d60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
11d70 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
11d80 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
11d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
11da0 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
11db0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
11dc0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
11dd0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
11de0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
11df0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
11e00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11e10 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
11e20 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
11e30 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
11e40 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
11e50 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
11e60 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
11e70 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
11e80 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
11e90 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
11ea0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
11eb0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
11ec0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
11ed0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
11ee0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a  red *pBt, Pgno *
11ef0 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20  pnTrunc){.  int 
11f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11f10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11f20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
11f30 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
11f40 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
11f50 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
11f60 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
11f70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11f80 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11f90 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
11fa0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
11fb0 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
11fc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
11fd0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
11fe0 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
11ff0 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20  gno nFin = 0;.. 
12000 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
12010 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50  nc==0 ){.      P
12020 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20  gno nFree;.     
12030 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20   Pgno nPtrmap;. 
12040 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70       const int p
12050 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  gsz = pBt->pageS
12060 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ize;.      Pgno 
12070 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
12080 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20  ecount(pBt);..  
12090 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
120a0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
120b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
120c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
120d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
120e0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
120f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
12100 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
12110 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
12120 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
12130 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
12140 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
12150 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
12160 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
12170 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
12180 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
12190 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
121a0 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
121b0 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
121c0 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
121d0 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
121e0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
121f0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
12200 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
12210 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
12220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
12230 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
12240 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
12250 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
12260 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
12270 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
12280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12290 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
122a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
122b0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
122c0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
122d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
122e0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
122f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
12300 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
12310 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
12320 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
12330 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12340 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
12350 70 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e  pBt->nTrunc && n
12360 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Fin ){.        r
12370 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12380 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
12390 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
123a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
123b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
123c0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
123d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
123e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
123f0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  36], 0);.       
12400 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e   pBt->nTrunc = n
12410 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
12420 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12440 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
12450 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
12460 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
12470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12480 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d  {.    *pnTrunc =
12490 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
124a0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
124b0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
124c0 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
124d0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
124e0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
124f0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
12500 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
12510 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
12520 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
12530 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
12540 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
12550 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
12560 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
12570 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
12580 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
12590 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
125a0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
125b0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
125c0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
125d0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
125e0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
125f0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
12600 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
12610 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
12620 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
12630 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
12640 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
12650 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
12660 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12670 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
12680 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
12690 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
126a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
126b0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
126c0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
126d0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
126e0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
126f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12700 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
12710 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
12720 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
12730 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
12740 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
12750 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
12760 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
12770 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
12780 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
12790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
127a0 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
127b0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
127c0 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72  treeCommit() for
127d0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
127e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
127f0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
12800 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
12810 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
12820 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
12830 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
12840 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
12850 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
12860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12870 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
12880 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
12890 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
128a0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
128b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
128c0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
128d0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
128e0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
128f0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
12900 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
12910 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
12920 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
12930 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
12940 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
12950 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
12960 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
12970 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
12980 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
12990 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
129a0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
129b0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
129c0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
129d0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
129e0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
129f0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
12a00 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
12a10 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
12a20 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
12a30 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
12a40 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
12a50 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
12a60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
12a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12a80 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
12a90 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
12aa0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
12ab0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12ac0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
12ad0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
12ae0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
12af0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12b00 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d     Pgno nTrunc =
12b10 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
12b20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12b30 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
12b40 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
12b50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12b60 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
12b70 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
12b80 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
12b90 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e  umCommit(pBt, &n
12ba0 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69  Trunc); .      i
12bb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12bd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12be0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12bf0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12c00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
12c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
12c20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
12c30 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
12c40 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a  er, nTrunc, 0);.
12c50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12c60 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
12c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12c80 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
12c90 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
12ca0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
12cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12cc0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
12cd0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
12ce0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
12cf0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
12d00 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
12d10 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
12d20 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
12d30 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
12d40 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
12d50 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12d60 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
12d70 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
12d80 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
12d90 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
12da0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
12db0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
12dc0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
12dd0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
12de0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
12df0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
12e00 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
12e10 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
12e20 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
12e30 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
12e40 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12e50 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
12e60 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
12e70 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
12e80 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
12e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
12ea0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
12eb0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
12ec0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
12ed0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
12ee0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
12ef0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
12f00 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
12f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12f20 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12f30 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
12f40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12f50 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
12f60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12f70 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
12f80 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
12f90 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
12fa0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
12fb0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
12fc0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
12fd0 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
12fe0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
12ff0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
13000 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
13010 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
13020 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
13030 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
13040 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
13050 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13060 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13070 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
13080 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13090 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
130a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
130b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
130c0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
130d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
130e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
130f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
13100 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
13110 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13120 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13130 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
13140 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
13150 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
13160 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
13170 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
13180 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
13190 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
131a0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
131b0 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
131c0 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
131d0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
131e0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
131f0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
13200 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
13210 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
13220 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
13230 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
13240 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
13250 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
13260 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
13270 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13280 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13290 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
132a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
132b0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
132c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
132d0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
132e0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
132f0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
13300 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
13310 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
13320 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
13330 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
13340 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
13350 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
13360 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
13370 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
13380 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
13390 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61  .  */.  p->inTra
133a0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
133b0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
133c0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
133d0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
133e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
133f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13410 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
13420 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
13430 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
13440 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
13450 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13460 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
13470 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
13480 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13490 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
134a0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
134b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
134c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
134d0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
134e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
134f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13500 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
13510 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
13520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
13530 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
13540 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
13550 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
13560 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
13570 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
13580 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
13590 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
135a0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
135b0 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
135c0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
135d0 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
135e0 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
135f0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
13600 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
13610 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
13620 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
13630 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
13640 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
13650 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
13660 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
13670 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
13680 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
13690 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
136a0 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
136b0 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
136c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
136d0 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
136e0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
136f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
13700 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
13710 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
13720 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
13730 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
13740 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
13750 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
13760 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
13770 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
13780 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
13790 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
137a0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
137b0 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
137c0 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
137d0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
137e0 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
137f0 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
13800 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
13810 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
13820 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
13830 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
13840 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
13850 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
13860 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
13870 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
13880 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
13890 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
138a0 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
138b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
138c0 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
138d0 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
138e0 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
138f0 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
13900 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
13910 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
13920 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
13930 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
13940 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
13950 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
13960 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
13970 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
13980 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
13990 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
139a0 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
139b0 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
139c0 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
139d0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
139e0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
139f0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
13a00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13a10 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
13a20 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
13a30 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
13a40 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
13a50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13a60 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
13a70 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
13a80 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
13a90 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
13aa0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
13ab0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
13ac0 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
13ad0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
13ae0 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20  LT;.    p->skip 
13af0 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
13b00 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
13b10 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
13b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
13b30 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
13b40 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
13b50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
13b60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13b70 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
13b80 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
13b90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13ba0 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
13bb0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
13bc0 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
13bd0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
13be0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
13bf0 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
13c00 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
13c10 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13c20 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
13c30 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
13c40 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
13c50 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
13c60 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
13c70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13c80 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
13c90 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
13ca0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
13cb0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
13cc0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
13cd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13ce0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
13cf0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
13d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13d10 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
13d20 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
13d30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13d40 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
13d50 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61  p->db;.  rc = sa
13d60 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
13d70 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
13d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13d90 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
13da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13db0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
13dc0 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
13dd0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
13de0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
13df0 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
13e00 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
13e10 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
13e20 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
13e30 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
13e40 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
13e50 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
13e60 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
13e70 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
13e80 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
13e90 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
13ea0 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
13eb0 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
13ec0 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
13ed0 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
13ee0 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
13ef0 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
13f00 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
13f10 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
13f20 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
13f30 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
13f40 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
13f50 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
13f60 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
13f70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
13f80 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
13f90 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
13fa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
13fb0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13fc0 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
13fd0 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
13fe0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
13ff0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
14000 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
14010 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14020 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
14030 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
14040 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
14050 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
14060 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
14070 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
14080 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
14090 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
140a0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
140b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
140c0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
140d0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
140e0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
140f0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
14100 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
14110 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
14120 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14130 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
14140 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
14150 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
14160 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
14170 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
14180 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14190 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
141a0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
141b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
141c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
141d0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
141e0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
141f0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
14200 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
14210 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14220 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
14230 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
14240 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
14250 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14260 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
14270 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
14280 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
14290 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
142a0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
142b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
142c0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
142d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
142e0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
142f0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
14300 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
14310 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14320 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14330 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14340 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14350 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
14370 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
14380 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
14390 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
143a0 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
143b0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
143c0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
143d0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
143e0 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
143f0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
14400 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
14410 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
14420 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
14430 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
14440 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
14450 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
14460 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
14470 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
14480 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
14490 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
144a0 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
144b0 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
144c0 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
144d0 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
144e0 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
144f0 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
14500 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14510 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
14520 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
14530 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
14540 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
14550 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
14560 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
14570 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
14580 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
14590 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
145a0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
145b0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
145c0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
145d0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
145e0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
145f0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
14600 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
14610 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
14620 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
14630 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14650 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
14660 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14670 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14680 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
14690 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
146a0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
146b0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ->db;.  if( (p->
146c0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
146d0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
146e0 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Stmt ){.    rc =
146f0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
14700 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14710 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
14720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14730 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
14740 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
14750 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20  WRITE );.    rc 
14760 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
14770 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
14780 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
14790 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
147a0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
147b0 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 1;.  }.  sql
147c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
147d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
147e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
147f0 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75   the statment su
14800 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72  btransaction cur
14810 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
14820 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ss.  If no.** su
14830 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
14840 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20  active, this is 
14850 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
14860 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14870 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  itStmt(Btree *p)
14880 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
14890 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
148a0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
148b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
148c0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
148d0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
148e0 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
148f0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
14900 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
14910 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61  tCommit(pBt->pPa
14920 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
14930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14940 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e  K;.  }.  pBt->in
14950 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Stmt = 0;.  sqli
14960 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14970 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14980 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
14990 20 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74   the active stat
149a0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
149b0 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62  tion.  If no sub
149c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
149d0 73 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f  s active this ro
149e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
149f0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  ..**.** All curs
14a00 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
14a10 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
14a20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
14a30 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73  attempt.** to us
14a40 65 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  e a cursor that 
14a50 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
14a60 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
14a70 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77  s operation.** w
14a80 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
14a90 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
14aa0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
14ab0 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ackStmt(Btree *p
14ac0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14ad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
14ae0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14af0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
14b00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
14b10 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
14b20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
14b30 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
14b40 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
14b50 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
14b60 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
14b70 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
14b80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
14b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14ba0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14bb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
14bc0 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
14bd0 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
14be0 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
14bf0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
14c00 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
14c10 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
14c20 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
14c30 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
14c40 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
14c50 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
14c60 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14c70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
14c80 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
14c90 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
14ca0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14cb0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
14cc0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
14cd0 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
14ce0 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
14cf0 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
14d00 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
14d10 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
14d20 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
14d30 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
14d40 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
14d50 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
14d60 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
14d70 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
14d80 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
14d90 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
14da0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
14db0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
14dc0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
14dd0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
14de0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
14df0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
14e00 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
14e10 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
14e20 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
14e30 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
14e40 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
14e50 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
14e60 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
14e70 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
14e80 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
14e90 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
14ea0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
14eb0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
14ec0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
14ed0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
14ee0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
14ef0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
14f00 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
14f10 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
14f20 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
14f30 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
14f40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
14f50 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
14f60 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
14f70 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
14f80 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
14f90 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
14fa0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
14fb0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
14fc0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
14fd0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
14fe0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
14ff0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
15000 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
15010 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
15020 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
15030 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
15040 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
15050 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
15060 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
15070 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
15080 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
15090 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
150c0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
150f0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
15100 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
15110 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
15140 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
15150 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
15160 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
15170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
15180 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
15190 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
151a0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
151b0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
151c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
151d0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
151e0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
151f0 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  c;.  Pgno nPage;
15200 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15210 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
15220 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
15230 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
15240 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  );.  if( wrFlag 
15250 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  ){.    if( pBt->
15260 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
15270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15280 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
15290 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61      if( checkRea
152a0 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65  dLocks(p, iTable
152b0 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
152c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
152d0 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OCKED;.    }.  }
152e0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ..  if( pBt->pPa
152f0 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ge1==0 ){.    rc
15300 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68   = lockBtreeWith
15310 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66  Retry(p);.    if
15320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15330 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15340 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
15350 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
15360 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  && wrFlag ){.   
15370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15380 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
15390 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
153a0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
153b0 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  able;.  rc = sql
153c0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
153d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
153e0 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20  (int *)&nPage); 
153f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
15410 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
15420 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50   iTable==1 && nP
15430 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  age==0 ){.    rc
15440 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
15450 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
15460 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
15470 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  n;.  }.  rc = ge
15480 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
15490 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
154a0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
154b0 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  0]);.  if( rc!=S
154c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
154d0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
154e0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
154f0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
15500 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
15510 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
15520 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
15530 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
15540 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20  variables, link 
15550 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
15560 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
15570 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72  t and set *ppCur
15580 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75   (the.  ** outpu
15590 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
155a0 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20  is function)..  
155b0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  */.  pCur->pKeyI
155c0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
155d0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
155e0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
155f0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
15600 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a  rFlag = wrFlag;.
15610 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
15620 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
15630 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
15640 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
15650 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
15660 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
15670 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
15680 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
15690 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20  RSOR_INVALID;.. 
156a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
156b0 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
156c0 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72  r_exception:.  r
156d0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
156e0 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75  >apPage[0]);.  u
156f0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15700 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
15710 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
15720 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
15730 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15760 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
15770 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
157a0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
157b0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
157c0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
157f0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
15800 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
15810 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
15820 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
15830 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
15840 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
15850 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
15860 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
15890 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
158a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
158b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
158c0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
158d0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
158e0 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
158f0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
15900 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
15910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15920 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15930 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
15940 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
15950 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ze(){.  return s
15960 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b  izeof(BtCursor);
15970 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  .}..../*.** Clos
15980 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
15990 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
159a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
159b0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
159c0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
159d0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
159e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
159f0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
15a00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
15a10 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
15a20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
15a30 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
15a40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
15a50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
15a60 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
15a70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15a80 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d  Btree);.    pBt-
15a90 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  >db = pBtree->db
15aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
15ab0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
15ac0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
15ad0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
15ae0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
15af0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
15b00 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
15b10 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
15b20 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
15b30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15b40 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
15b50 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
15b60 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
15b70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
15b80 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
15b90 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
15ba0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
15bb0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
15bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
15bd0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
15be0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
15bf0 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
15c00 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
15c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
15c20 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
15c30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
15c40 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
15c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15c60 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
15c70 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
15c80 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
15c90 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
15ca0 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
15cb0 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
15cc0 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
15cd0 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
15ce0 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Btree..*/.void s
15cf0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
15d00 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
15d10 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
15d20 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
15d30 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
15d40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15d50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d  x(pCur) );.  mem
15d60 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
15d70 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72  ur, sizeof(BtCur
15d80 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  sor));.  pTempCu
15d90 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
15da0 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
15db0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
15dc0 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61  i<=pTempCur->iPa
15dd0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ge; i++){.    sq
15de0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54  lite3PagerRef(pT
15df0 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  empCur->apPage[i
15e00 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ]->pDbPage);.  }
15e10 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70  .  assert( pTemp
15e20 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a  Cur->pKey==0 );.
15e30 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
15e40 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
15e50 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
15e60 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
15e70 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
15e80 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
15e90 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  bove..*/.void sq
15ea0 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
15eb0 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
15ec0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
15ed0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
15ee0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
15ef0 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28  (pCur) );.  for(
15f00 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
15f10 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
15f20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
15f30 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
15f40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
15f50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15f60 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 2f  Cur->pKey);.}../
15f70 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15f80 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
15f90 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
15fa0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
15fb0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
15fc0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
15fd0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
15fe0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
15ff0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
16000 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
16010 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
16020 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
16030 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
16040 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
16050 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
16060 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
16070 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
16080 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
16090 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
160a0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
160b0 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
160c0 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
160d0 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
160e0 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
160f0 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
16100 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
16110 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
16120 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
16130 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
16140 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
16150 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
16160 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
16170 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
16180 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
16190 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
161a0 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
161b0 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
161c0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
161d0 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
161e0 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
161f0 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
16200 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
16210 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
16220 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
16230 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
16240 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
16250 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
16260 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
16270 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
16280 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
16290 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
162a0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
162b0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
162c0 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
162d0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
162e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
162f0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
16300 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
16310 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
16320 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
16330 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
16340 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
16350 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
16360 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
16370 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
16380 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
16390 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
163a0 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
163b0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
163c0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
163d0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
163e0 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
163f0 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
16400 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
16410 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
16420 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
16430 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
16440 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
16450 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ge;.      sqlite
16460 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
16470 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
16480 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
16490 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
164a0 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
164b0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
164c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
164d0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
164e0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
164f0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
16500 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
16510 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
16520 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
16530 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
16540 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
16550 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
16560 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
16570 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
165b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
165c0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
16600 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
16610 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
16650 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
16660 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
16670 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
16680 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
16690 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
166a0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
166b0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
166f0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
16740 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
16750 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
16790 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
167a0 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
167b0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
167c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
167d0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
167e0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
167f0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
16800 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
16810 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
16820 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
16830 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
16840 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
16850 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
16860 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
16870 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
16880 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
16890 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
168a0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
168b0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
168c0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
168d0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
168e0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
168f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
16900 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
16910 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16920 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
16930 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
16940 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
16950 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
16960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16970 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
16980 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
16990 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
169a0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
169b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
169c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
169d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
169e0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70  ALID ){.      *p
169f0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
16a00 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
16a10 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
16a20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
16a30 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
16a40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
16a60 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
16a70 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16a80 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
16a90 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
16aa0 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
16ab0 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20  nts to.  Always 
16ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ad0 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  ..** Failure is 
16ae0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  not possible.  I
16af0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
16b00 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  not currently.**
16b10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20   pointing to an 
16b20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e  entry (which can
16b30 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
16b40 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20  mple, if.** the 
16b50 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
16b60 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69  y) then *pSize i
16b70 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  s set to 0..*/.i
16b80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
16b90 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
16ba0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
16bb0 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
16bc0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
16bd0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
16be0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
16bf0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
16c00 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
16c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16c20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
16c30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16c40 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
16c50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16c60 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
16c70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16c80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
16c90 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f  .      /* Not po
16ca0 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
16cb0 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70  d entry - set *p
16cc0 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20  Size to 0. */.  
16cd0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
16ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16cf0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
16d00 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
16d10 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
16d20 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
16d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16d40 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
16d50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
16d60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
16d70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
16d80 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
16d90 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
16da0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
16db0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
16dc0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
16dd0 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
16de0 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
16df0 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
16e00 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
16e10 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
16e20 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
16e30 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
16e40 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
16e50 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
16e60 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
16e70 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
16e80 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16e90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
16ea0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55  herwise:.**.** U
16eb0 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20  nless pPgnoNext 
16ec0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67  is NULL, the pag
16ed0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16ee0 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  next overflow .*
16ef0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  * page in the li
16f00 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72 69  nked list is wri
16f10 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
16f20 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
16f30 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
16f40 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
16f50 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ed list, *pPgnoN
16f60 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
16f70 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
16f80 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
16f90 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  , *ppPage is set
16fa0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a   to the MemPage*
16fb0 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70   handle.** for p
16fc0 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e  age ovfl. The un
16fd0 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70  derlying pager p
16fe0 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  age may have bee
16ff0 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77  n requested.** w
17000 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e  ith the noConten
17010 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74  t flag set, so t
17020 68 65 20 70 61 67 65 20 64 61 74 61 20 61 63 63  he page data acc
17030 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74  essable via.** t
17040 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e  his handle may n
17050 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a  ot be trusted..*
17060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
17070 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
17080 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
17090 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
170b0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
170c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
170d0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
170e0 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
170f0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
17100 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
17110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
17120 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
17130 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
17140 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
17150 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
17160 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17170 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
17180 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
17190 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73  One of these mus
171a0 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f  t not be NULL. O
171b0 74 68 65 72 77 69 73 65 2c 20 77 68 79 20 63 61  therwise, why ca
171c0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
171d0 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70  ? */.  assert(pp
171e0 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78  Page || pPgnoNex
171f0 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67  t);..  /* If pPg
17200 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20  noNext is NULL, 
17210 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
17220 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
17230 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a  ed to obtain.  *
17240 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66  * a MemPage* ref
17250 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20  erence only. No 
17260 70 61 67 65 2d 64 61 74 61 20 69 73 20 72 65 71  page-data is req
17270 75 69 72 65 64 20 69 6e 20 74 68 69 73 20 63 61  uired in this ca
17280 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se..  */.  if( !
17290 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20  pPgnoNext ){.   
172a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
172b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
172c0 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31   ovfl, ppPage, 1
172d0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
172e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
172f0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
17300 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
17310 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
17320 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
17330 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
17340 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
17350 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
17360 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
17370 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
17380 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
17390 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
173a0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
173b0 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
173c0 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
173d0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
173e0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
173f0 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
17400 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
17410 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
17420 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
17430 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
17440 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
17450 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
17460 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
17470 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
17480 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
17490 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
174a0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
174b0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
174c0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
174d0 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
174e0 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
174f0 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  s<=pagerPagecoun
17500 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
17510 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
17520 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
17530 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
17540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17570 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  }.      if( eTyp
17580 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
17590 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
175a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
175b0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
175c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
175d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74  ndif..  if( next
175e0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b  ==0 || ppPage ){
175f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
17600 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  age = 0;..    rc
17610 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
17620 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
17630 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d  , &pPage, next!=
17640 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72  0);.    assert(r
17650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
17660 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69  pPage==0);.    i
17670 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63  f( next==0 && rc
17680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17690 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
176a0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
176b0 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  a);.    }..    i
176c0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
176d0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
176e0 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ge;.    }else{. 
176f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17700 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
17710 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20   }.  *pPgnoNext 
17720 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72  = next;..  retur
17730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
17740 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
17750 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
17760 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
17770 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
17780 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
17790 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
177a0 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
177b0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
177c0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
177d0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
177e0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
177f0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
17800 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
17810 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
17820 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
17830 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
17840 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
17850 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17860 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
17870 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
17880 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
17890 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
178a0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
178b0 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
178c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
178d0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
178e0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
178f0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
17900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
17910 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
17920 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
17930 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
17940 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
17950 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17970 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
17980 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
17990 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
179a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
179b0 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
179c0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179e0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
179f0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
17a00 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
17a10 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
17a20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
17a30 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
17a40 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
17a50 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
17a60 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
17a70 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
17a80 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
17a90 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
17aa0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17ab0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
17ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17ad0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17ae0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
17af0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
17b00 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
17b10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
17b20 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
17b30 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
17b40 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
17b50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
17b60 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
17b70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
17b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17b90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17ba0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
17bb0 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
17bc0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
17bd0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
17be0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
17bf0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
17c00 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
17c10 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
17c20 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
17c30 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
17c40 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
17c50 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
17c60 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
17c70 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
17c80 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
17c90 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17ca0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
17cb0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
17cc0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
17cd0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
17ce0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
17cf0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
17d00 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
17d10 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
17d20 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
17d30 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
17d40 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
17d50 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
17d60 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
17d70 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
17d80 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
17d90 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
17da0 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
17db0 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
17dc0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
17dd0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
17de0 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
17df0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
17e00 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
17e10 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
17e20 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
17e30 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
17e40 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
17e50 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
17e60 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
17e70 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
17e80 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
17e90 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
17ea0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
17eb0 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
17ec0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
17ed0 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
17ee0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
17ef0 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
17f00 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
17f10 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
17f20 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
17f30 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
17f40 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17f50 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
17f60 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
17f70 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
17f80 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
17f90 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
17fa0 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
17fb0 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
17fc0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
17fd0 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
17fe0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
17ff0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
18000 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
18010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
18020 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
18030 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
18040 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
18050 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
18060 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
18070 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
18080 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
18090 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
180a0 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
180b0 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
180c0 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
180d0 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
180e0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
180f0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
18100 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
18110 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
18120 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
18130 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
18140 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
18150 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
18160 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
18170 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
18180 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
18190 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
181a0 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
181b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
181c0 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
181d0 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
181e0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
181f0 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
18200 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
18210 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
18220 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
18230 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
18240 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
18250 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
18260 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
18270 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
18280 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
18290 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
182a0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
182b0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
182c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
182d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
182e0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
182f0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
18300 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
18310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18320 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18340 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
18350 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
18360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
18380 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18390 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
183a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
183b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
183c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
183d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
183e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
183f0 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
18400 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
18410 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
18420 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
18430 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
18440 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
18450 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d  tKey ? 0 : pCur-
18460 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
18470 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
18480 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65     offset += nKe
18490 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  y;.  }.  if( off
184a0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
184b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20  Cur->info.nData 
184c0 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64  .   || &aPayload
184d0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
184e0 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
184f0 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
18500 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ize].  ){.    /*
18510 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
18520 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
18530 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
18540 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
18550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18560 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
18580 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
18590 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
185a0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
185b0 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
185c0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
185d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
185e0 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
185f0 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
18600 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
18610 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
18620 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
18630 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
18640 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
18650 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
18660 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
18670 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
18680 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
18690 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
186a0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
186b0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
186c0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
186d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
186e0 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
186f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
18700 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
18710 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
18720 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18730 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
18740 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
18750 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
18760 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
18770 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
18780 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
18790 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
187a0 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
187b0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
187c0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
187d0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
187e0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
187f0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
18800 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
18810 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
18820 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
18830 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
18840 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
18850 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
18860 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
18870 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
18880 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
18890 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
188a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
188b0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
188c0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
188d0 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
188e0 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
188f0 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
18900 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
18910 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
18920 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
18930 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
18940 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
18950 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
18960 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
18970 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
18980 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
18990 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
189a0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
189b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
189c0 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
189d0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
189e0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
189f0 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d  (Pgno *)sqlite3M
18a00 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
18a10 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
18a20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26       if( nOvfl &
18a30 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
18a40 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
18a50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18a70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
18a80 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
18a90 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
18aa0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
18ab0 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
18ac0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
18ad0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
18ae0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
18af0 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
18b00 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
18b10 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
18b20 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
18b30 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
18b40 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
18b50 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
18b60 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
18b70 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
18b80 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18b90 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
18ba0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
18bb0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
18bc0 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
18bd0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
18be0 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
18bf0 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
18c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18c10 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
18c20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
18c30 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
18c40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
18c50 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
18c60 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
18c70 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
18c80 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
18c90 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
18ca0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
18cb0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
18cc0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
18cd0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18ce0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
18cf0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
18d00 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
18d10 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
18d20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
18d30 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
18d40 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
18d50 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
18d60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
18d70 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
18d80 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
18d90 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
18da0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
18db0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
18dc0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
18dd0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
18de0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
18df0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
18e00 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
18e10 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
18e20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
18e30 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
18e40 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
18e50 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
18e60 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
18e70 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
18e80 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
18e90 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
18ea0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
18eb0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
18ec0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
18ed0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
18ee0 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
18ef0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
18f00 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
18f10 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
18f20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
18f30 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
18f40 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
18f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18f60 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
18f70 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
18f80 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
18f90 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
18fa0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
18fb0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
18fc0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
18fd0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
18fe0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
18ff0 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
19000 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
19010 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
19020 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19030 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
19040 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
19050 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
19060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19080 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
19090 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
190a0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
190b0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
190c0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
190d0 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
190e0 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
190f0 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
19100 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
19110 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
19120 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19130 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
19140 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
19150 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
19160 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
19170 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
19180 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
19190 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
191a0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
191b0 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
191c0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
191d0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
191e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
191f0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
19200 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
19210 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
19220 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19230 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
19240 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19250 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
19260 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
19270 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
19280 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
19290 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
192a0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
192b0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
192c0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
192d0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
192e0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
192f0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
19300 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
19310 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
19320 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
19330 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
19340 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
19350 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
19360 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
19370 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
19380 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19390 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
193a0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
193b0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
193c0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
193d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
193e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
193f0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
19400 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
19410 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19430 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19440 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19450 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
19460 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
19470 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
19480 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
19490 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ] );.    if( pCu
194a0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
194b0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
194c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
194d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
194e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
194f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
19500 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
19510 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
19520 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
19530 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
19540 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
19550 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
19560 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a  r*)pBuf, 0, 0);.
19570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
19590 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
195a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
195b0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
195c0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
195d0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
195e0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
195f0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
19600 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
19610 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
19620 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19630 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
19640 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
19650 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
19660 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
19670 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
19680 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
19690 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
196a0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
196b0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
196c0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
196d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
196e0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
196f0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
19700 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
19710 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19720 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
19730 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19740 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
19750 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19760 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
19770 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
19780 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19790 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
197a0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
197b0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
197c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
197d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
197e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
197f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19800 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19810 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
19820 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
19830 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
19840 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
19850 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
19860 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
19870 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
19880 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
19890 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
198a0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
198b0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 1, 0);.  }.  r
198c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
198d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
198e0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
198f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
19900 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
19910 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
19920 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
19930 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
19940 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
19950 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
19960 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
19970 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
19980 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
19990 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
199a0 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
199b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
199c0 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
199d0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
199e0 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
199f0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
19a00 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19a10 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
19a20 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
19a30 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
19a40 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
19a50 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
19a60 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
19a70 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
19a80 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
19a90 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
19aa0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
19ab0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
19ac0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
19ad0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
19ae0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
19af0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
19b00 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
19b10 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
19b20 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
19b30 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
19b40 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
19b50 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
19b60 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
19b70 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
19b80 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
19b90 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  y.** the key/dat
19ba0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
19bb0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
19bc0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
19bd0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
19be0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
19bf0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
19c00 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
19c10 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
19c20 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
19c30 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
19c40 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
19c50 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
19c60 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
19c70 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
19c80 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
19c90 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
19ca0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
19cb0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
19cc0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
19cd0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
19ce0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
19cf0 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
19d00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
19d10 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
19d20 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
19d30 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
19d40 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
19d50 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
19d60 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
19d70 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
19d80 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
19d90 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19da0 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
19db0 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    u32 nLocal;.. 
19dc0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
19dd0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
19de0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
19df0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
19e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19e10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19e20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
19e30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19e40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19e50 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
19e60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
19e70 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
19e80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
19e90 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
19ea0 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ll );.  getCellI
19eb0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
19ec0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
19ed0 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
19ee0 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
19ef0 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
19f00 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
19f10 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
19f20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
19f30 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
19f40 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
19f50 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
19f60 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
19f70 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
19f80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
19f90 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
19fa0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
19fb0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
19fc0 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
19fd0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
19fe0 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
19ff0 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
1a000 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
1a010 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
1a020 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
1a030 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1a040 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
1a050 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
1a060 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
1a070 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
1a080 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
1a090 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
1a0a0 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
1a0b0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1a0c0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
1a0d0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
1a0e0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1a0f0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
1a100 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
1a110 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
1a120 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
1a130 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
1a140 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
1a150 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
1a160 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
1a170 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
1a180 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
1a190 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
1a1a0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
1a1b0 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
1a1c0 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
1a1d0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
1a1e0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
1a1f0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
1a200 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
1a210 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
1a220 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
1a230 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1a240 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
1a250 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
1a260 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
1a270 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
1a280 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1a290 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1a2a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a2b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a2c0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1a2d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a2e0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1a2f0 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
1a300 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1a310 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
1a320 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63  .  return 0;.}.c
1a330 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
1a340 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
1a350 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1a360 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61   int *pAmt){.  a
1a370 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1a380 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1a390 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1a3a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a3b0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1a3c0 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1a3d0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1a3e0 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
1a3f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
1a400 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1a410 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
1a420 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
1a430 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
1a440 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
1a450 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1a460 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
1a470 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ove to..*/.stati
1a480 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
1a490 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1a4a0 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
1a4b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1a4c0 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
1a4d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
1a4e0 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
1a4f0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1a500 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
1a510 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a520 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1a530 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a540 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a550 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a560 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
1a570 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
1a580 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
1a590 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1a5a0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
1a5b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1a5c0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1a5d0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1a5e0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1a5f0 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
1a600 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a610 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
1a620 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
1a630 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
1a640 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
1a650 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
1a660 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a670 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1a680 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1a690 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
1a6a0 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  l<1 ){.    retur
1a6b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a6c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1a6d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a6e0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a6f0 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
1a700 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
1a710 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
1a720 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
1a730 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
1a740 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
1a750 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1a760 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
1a770 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
1a780 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
1a790 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
1a7a0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
1a7b0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1a7c0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
1a7d0 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
1a7e0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
1a7f0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
1a800 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
1a810 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a820 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1a830 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
1a840 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
1a850 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
1a860 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
1a870 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
1a880 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
1a890 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
1a8a0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1a8b0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
1a8c0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
1a8d0 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
1a8e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a8f0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1a900 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
1a910 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
1a920 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
1a930 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
1a940 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
1a950 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
1a960 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a970 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1a980 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1a990 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1a9a0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1a9b0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1a9c0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1a9d0 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1a9e0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1a9f0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1aa00 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1aa10 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1aa20 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1aa30 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1aa40 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1aa50 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1aa60 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
1aa70 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1aa80 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
1aa90 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1aaa0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1aab0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1aac0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1aad0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1aae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1aaf0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
1ab00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1ab10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ab20 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
1ab30 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
1ab40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ab50 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1ab60 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1ab70 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
1ab80 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
1ab90 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
1aba0 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
1abb0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1abc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1abd0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
1abe0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1abf0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1ac00 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1ac10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1ac20 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1ac30 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74   root page.*/.st
1ac40 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1ac50 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
1ac60 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1ac70 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
1ac80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
1ac90 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
1aca0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
1acb0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1acc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1acd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ace0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1acf0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
1ad00 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1ad10 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1ad20 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
1ad30 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
1ad40 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
1ad50 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
1ad60 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
1ad70 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
1ad80 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
1ad90 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1ada0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1adb0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1adc0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
1add0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
1ade0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  p;.    }.    sql
1adf0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1ae00 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
1ae10 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
1ae20 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=0 ){.    int
1ae30 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
1ae40 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1ae50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1ae60 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1ae70 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1ae80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1ae90 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
1aea0 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
1aeb0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
1aec0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
1aed0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29  Cur->apPage[0]))
1aee0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1aef0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1af00 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1af10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1af20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74    }.  }..  pRoot
1af30 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1af40 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
1af50 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
1af60 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70  >pgnoRoot );.  p
1af70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
1af80 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
1af90 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1afa0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1afb0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
1afc0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1afd0 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
1afe0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
1aff0 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
1b000 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
1b010 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  age;.    assert(
1b020 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pRoot->pgno==1 
1b030 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  );.    subpage =
1b040 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
1b050 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
1b060 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1b070 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67    assert( subpag
1b080 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  e>0 );.    pCur-
1b090 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1b0a0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
1b0b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1b0c0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
1b0d0 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
1b0e0 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
1b0f0 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
1b100 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
1b110 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
1b120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b130 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1b140 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
1b150 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
1b160 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1b170 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
1b180 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1b190 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
1b1a0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
1b1b0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
1b1c0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
1b1d0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
1b1e0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
1b1f0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1b200 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
1b210 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1b220 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1b230 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
1b240 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
1b250 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1b260 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b270 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b280 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1b290 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1b2a0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1b2b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b2c0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1b2d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1b2e0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
1b2f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1b300 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1b310 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
1b320 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
1b330 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1b340 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1b350 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1b360 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
1b370 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1b380 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
1b390 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b3a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b3b0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
1b3c0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
1b3d0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1b3e0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
1b3f0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1b400 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
1b410 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
1b420 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
1b430 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
1b440 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
1b450 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
1b460 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1b470 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
1b480 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1b490 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
1b4a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1b4b0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
1b4c0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1b4d0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
1b4e0 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
1b4f0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
1b500 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1b510 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
1b520 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
1b530 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1b540 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1b550 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
1b560 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1b570 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1b580 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b590 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
1b5a0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1b5b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b5c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b5d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b5e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b5f0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1b600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b610 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1b620 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1b630 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
1b640 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1b650 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1b660 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1b670 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
1b680 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1b690 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
1b6a0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
1b6b0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1b6c0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
1b6d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b6e0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1b6f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
1b700 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1b710 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1b720 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1b730 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1b740 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1b750 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1b760 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1b770 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1b780 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1b790 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1b7a0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1b7b0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1b7c0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1b7d0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1b7e0 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1b7f0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1b800 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1b810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b820 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
1b830 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1b840 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1b850 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b860 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b870 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b880 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b890 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1b8a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1b8b0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1b8c0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1b8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b8e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1b8f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1b900 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
1b910 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1b920 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1b930 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b940 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b960 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1b970 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b980 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b990 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
1b9a0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1b9b0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1b9c0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1b9d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1b9e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b9f0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1ba00 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1ba10 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1ba20 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1ba30 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1ba40 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1ba50 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1ba60 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1ba70 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1ba80 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1ba90 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1baa0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1bab0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
1bac0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bad0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1bae0 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
1baf0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1bb00 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1bb10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1bb20 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1bb30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1bb40 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1bb50 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1bb60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bb70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
1bb80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1bb90 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1bba0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1bbb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1bbc0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1bbd0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1bbe0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1bbf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1bc00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bc10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
1bc20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1bc30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1bc40 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1bc50 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1bc60 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
1bc70 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
1bc80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bc90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bca0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1bcb0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1bcc0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1bcd0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
1bce0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
1bcf0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
1bd00 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
1bd10 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
1bd20 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
1bd30 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
1bd40 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1bd50 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
1bd60 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
1bd70 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
1bd80 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
1bd90 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
1bda0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
1bdb0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
1bdc0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
1bdd0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
1bde0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
1bdf0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
1be00 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
1be10 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
1be20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
1be30 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
1be40 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
1be50 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
1be60 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
1be70 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
1be80 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
1be90 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
1bea0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
1beb0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
1bec0 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a   to which the.**
1bed0 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74 74   cursor is writt
1bee0 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70  en to *pRes if p
1bef0 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20  Res!=NULL.  The 
1bf00 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  meaning of.** th
1bf10 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20 66  is value is as f
1bf20 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1bf30 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
1bf40 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1bf50 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1bf60 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1bf90 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  pKey or if the t
1bfa0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
1bfd0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
1bfe0 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
1bff0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
1c000 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
1c010 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1c020 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1c030 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
1c050 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65  ctly matches pKe
1c060 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
1c070 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
1c080 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1c090 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1c0a0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1c0b0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
1c0c0 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a  rger than pKey..
1c0d0 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
1c0e0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1c0f0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
1c100 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
1c110 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
1c120 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
1c130 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1c140 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
1c150 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
1c160 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c180 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
1c190 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
1c1a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1c1b0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
1c1c0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
1c1d0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
1c1e0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
1c1f0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
1c200 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
1c210 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1c220 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1c230 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c240 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c250 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c260 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1c270 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1c280 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1c290 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
1c2a0 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
1c2b0 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
1c2c0 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
1c2d0 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
1c2e0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1c2f0 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
1c300 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
1c310 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1c320 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
1c330 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75  dNKey .   && pCu
1c340 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
1c350 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
1c360 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
1c370 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
1c380 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1c390 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c3a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1c3b0 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73   if( pCur->atLas
1c3c0 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t && pCur->info.
1c3d0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
1c3e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
1c3f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1c410 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
1c420 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1c430 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1c440 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1c450 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1c460 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1c470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1c480 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1c490 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
1c4a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1c4b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1c4c0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
1c4d0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
1c4e0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1c4f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1c500 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
1c510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c520 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c530 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
1c540 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
1c550 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
1c560 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
1c570 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
1c580 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
1c590 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1c5a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c5b0 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d  ];.    int c = -
1c5c0 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75  1;  /* pRes retu
1c5d0 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65  rn if table is e
1c5e0 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20  mpty must be -1 
1c5f0 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  */.    lwr = 0;.
1c600 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
1c610 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
1c620 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
1c630 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 20 29   && pIdxKey==0 )
1c640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c650 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c660 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
1c670 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1c680 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69  }.    if( biasRi
1c690 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ght ){.      pCu
1c6a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1c6b0 50 61 67 65 5d 20 3d 20 75 70 72 3b 0a 20 20 20  Page] = upr;.   
1c6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
1c6d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1c6e0 69 50 61 67 65 5d 20 3d 20 28 75 70 72 2b 6c 77  iPage] = (upr+lw
1c6f0 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1c700 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
1c710 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1c720 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1c730 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1c740 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20  ;.      int idx 
1c750 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
1c760 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
1c770 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c780 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
1c790 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1c7a0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  1;.      if( pPa
1c7b0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1c7c0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
1c7d0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
1c7e0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1c7f0 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
1c800 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
1c810 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1c820 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
1c830 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
1c840 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
1c850 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
1c860 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
1c870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c880 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
1c890 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
1c8a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1c8b0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
1c8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1c8d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
1c8e0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69  e if( nCellKey<i
1c8f0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1c900 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
1c910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c920 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
1c930 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  lKey>intKey );. 
1c940 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
1c950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c970 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20  int available;. 
1c980 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1c990 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50  = (void *)fetchP
1c9a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76  ayload(pCur, &av
1c9b0 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  ailable, 0);.   
1c9c0 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20       nCellKey = 
1c9d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1c9e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61  .        if( ava
1c9f0 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79  ilable>=nCellKey
1ca00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1ca10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1ca20 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
1ca30 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  Key, pCellKey, p
1ca40 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
1ca50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ca60 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
1ca70 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
1ca80 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  lKey );.        
1ca90 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
1caa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1cab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1cac0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
1cad0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1cae0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
1caf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1cb00 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1cb10 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1cb20 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1cb30 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1cb40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1cb50 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
1cb60 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1cb70 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
1cb80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1cb90 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
1cba0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
1cbb0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1cbc0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1cbd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1cbe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1cbf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
1cc00 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1cc10 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1cc20 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1cc30 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1cc40 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
1cc50 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1cc60 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1cc70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1cc80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cc90 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1cca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ccb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ccc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1ccd0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1cce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ccf0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1cd00 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
1cd10 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
1cd20 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
1cd30 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
1cd40 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1cd50 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  r ){.        pCu
1cd60 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1cd70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1cd80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1cd90 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1cda0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1cdb0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
1cdc0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1cdd0 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
1cde0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1cdf0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
1ce00 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
1ce10 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1ce20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1ce30 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
1ce40 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
1ce50 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
1ce60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1ce70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1ce80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ce90 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1cea0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1ceb0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
1cec0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
1ced0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
1cee0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1cef0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1cf00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1cf10 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
1cf20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1cf30 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1cf40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cf50 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
1cf60 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1cf70 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
1cf80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1cf90 5d 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75  ] = lwr;.    pCu
1cfa0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1cfb0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1cfc0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
1cfd0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1cfe0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1cff0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1d000 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1d010 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
1d020 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
1d030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
1d040 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
1d050 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
1d060 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
1d070 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
1d080 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
1d090 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1d0a0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
1d0b0 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
1d0c0 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
1d0d0 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
1d0e0 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
1d0f0 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   work..*/.int sq
1d100 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1d110 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1d120 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
1d130 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
1d140 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
1d150 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
1d160 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
1d170 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
1d180 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
1d190 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
1d1a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1d1b0 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
1d1c0 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
1d1d0 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
1d1e0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
1d1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
1d200 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
1d210 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1d220 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1d230 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
1d240 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
1d250 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
1d280 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1d290 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
1d2a0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1d2b0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ex key */.  Unpa
1d2c0 63 6b 65 64 52 65 63 6f 72 64 20 61 53 70 61 63  ckedRecord aSpac
1d2d0 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d 70 20 73  e[16]; /* Temp s
1d2e0 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
1d2f0 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
1d300 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70  lloc */..  if( p
1d310 4b 65 79 20 29 7b 0a 20 20 20 20 70 49 64 78 4b  Key ){.    pIdxK
1d320 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1d330 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1d340 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  r->pKeyInfo, nKe
1d350 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1d380 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53  Space, sizeof(aS
1d390 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20  pace));.    if( 
1d3a0 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
1d3b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1d3c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d3d0 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
1d3e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1d3f0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1d400 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
1d410 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
1d420 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29  s);.  if( pKey )
1d430 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1d440 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
1d450 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
1d460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d470 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
1d480 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1d490 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1d4a0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1d4b0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1d4c0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1d4d0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1d4e0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1d4f0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1d500 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1d510 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1d520 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1d530 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1d540 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1d550 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1d560 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1d570 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1d580 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1d590 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1d5a0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1d5b0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1d5c0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1d5d0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1d5e0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1d5f0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1d600 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1d610 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1d620 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1d630 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1d640 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1d650 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1d660 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1d670 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1d680 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1d690 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1d6a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1d6b0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1d6c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
1d6d0 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a  e for a cursor..
1d6e0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
1d6f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 44 62  te3BtreeCursorDb
1d700 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20  (const BtCursor 
1d710 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1d720 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d730 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1d740 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1d750 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1d760 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f  pBtree->db;.}../
1d770 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1d780 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1d790 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1d7a0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1d7b0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1d7c0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1d7d0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1d7e0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1d7f0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1d800 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d810 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1d820 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1d830 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1d840 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1d850 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d860 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1d870 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1d880 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1d890 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
1d8a0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1d8b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d8c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1d8d0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1d8e0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1d8f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1d910 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1d920 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
1d930 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1d940 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1d950 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1d960 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1d970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1d980 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
1d990 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1d9a0 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1d9b0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1d9c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d9d0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1d9e0 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
1d9f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1da00 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
1da10 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
1da20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1da30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1da40 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1da50 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
1da60 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
1da70 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1da80 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1da90 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
1daa0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1dab0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
1dac0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1dad0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1dae0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
1daf0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1db00 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1db10 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
1db20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1db30 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1db40 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1db50 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1db60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1db70 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
1db80 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1db90 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
1dba0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1dbb0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1dbc0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1dbd0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
1dbe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dbf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1dc00 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1dc10 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1dc20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1dc30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1dc40 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
1dc50 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
1dc60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
1dc70 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1dc80 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1dc90 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1dca0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
1dcb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1dcc0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
1dcd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dcf0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1dd00 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
1dd10 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1dd20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
1dd30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dd40 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
1dd50 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1dd60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1dd70 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
1dd80 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1dd90 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1dda0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1ddb0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1ddc0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1ddd0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1dde0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1ddf0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1de00 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1de10 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1de20 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1de30 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1de40 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1de50 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1de60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1de70 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1de80 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1de90 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1dea0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1deb0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1dec0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ded0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1dee0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1def0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1df00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1df10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1df20 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
1df30 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
1df40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1df50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1df60 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1df70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1df80 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1df90 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
1dfa0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1dfb0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1dfc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1dfd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1dfe0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
1dff0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
1e000 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e010 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
1e020 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1e030 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1e040 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
1e050 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
1e060 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1e070 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1e080 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
1e090 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1e0a0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
1e0b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
1e0c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e0d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1e0e0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1e0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1e100 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1e110 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
1e120 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1e130 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
1e140 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1e150 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1e160 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
1e170 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
1e180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e1a0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
1e1b0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1e1c0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1e1d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1e1e0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1e1f0 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
1e200 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1e210 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
1e220 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1e230 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
1e240 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1e250 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
1e260 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1e270 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e280 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
1e290 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
1e2a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e2b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1e2c0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1e2d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e2e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1e2f0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
1e300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1e310 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
1e320 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
1e330 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
1e340 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
1e350 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
1e360 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1e370 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
1e380 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
1e390 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
1e3a0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
1e3b0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
1e3c0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
1e3d0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1e3e0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
1e3f0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
1e400 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
1e410 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
1e420 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1e430 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1e440 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
1e450 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
1e460 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
1e470 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
1e480 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
1e490 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
1e4a0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
1e4b0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
1e4c0 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
1e4d0 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
1e4e0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
1e4f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1e500 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
1e510 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1e520 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
1e530 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
1e540 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
1e550 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
1e560 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
1e570 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
1e580 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
1e590 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
1e5a0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
1e5b0 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
1e5c0 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
1e5d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
1e5e0 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
1e5f0 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
1e600 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
1e610 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
1e620 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
1e630 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
1e640 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
1e650 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
1e660 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1e670 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
1e680 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
1e690 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
1e6a0 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1e6b0 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1e6c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
1e6d0 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
1e6e0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
1e6f0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1e700 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
1e710 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
1e720 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1e730 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
1e740 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
1e750 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
1e760 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1e770 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
1e780 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  int n;     /* Nu
1e790 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1e7a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1e7b0 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a  .  int k;     /*
1e7c0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
1e7d0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
1e7e0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
1e7f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
1e800 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
1e810 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
1e820 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
1e830 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e840 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e850 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
1e860 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67  >pPage1;.  n = g
1e870 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1e880 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69  >aData[36]);.  i
1e890 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
1e8a0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
1e8b0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e8c0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
1e8d0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
1e8e0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
1e8f0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
1e900 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
1e910 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
1e920 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1e930 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
1e940 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1e950 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
1e960 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
1e970 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
1e980 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
1e990 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
1e9a0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
1e9b0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
1e9c0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1e9d0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
1e9e0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
1e9f0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1ea00 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
1ea10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ea20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ea30 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
1ea40 6e 65 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67  nearby<=pagerPag
1ea50 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1ea60 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
1ea70 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
1ea80 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
1ea90 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1eaa0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
1eab0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1eac0 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
1ead0 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
1eae0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1eaf0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1eb00 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1eb10 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
1eb20 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
1eb30 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
1eb40 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
1eb50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1eb60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1eb70 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
1eb80 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
1eb90 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1eba0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
1ebb0 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
1ebc0 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
1ebd0 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
1ebe0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
1ebf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ec00 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1ec10 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ec20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ec30 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1ec40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1ec50 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
1ec60 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
1ec70 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
1ec80 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
1ec90 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
1eca0 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
1ecb0 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
1ecc0 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
1ecd0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
1ece0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
1ecf0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
1ed00 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
1ed10 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
1ed20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
1ed30 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
1ed40 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
1ed50 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
1ed60 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
1ed70 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1ed80 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1ed90 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
1eda0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
1edb0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1edc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1edd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ede0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1edf0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1ee00 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
1ee10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1ee20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
1ee30 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1ee40 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ee50 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
1ee60 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
1ee70 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1ee80 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
1ee90 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
1eea0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
1eeb0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
1eec0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
1eed0 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
1eee0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
1eef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
1ef00 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
1ef10 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
1ef20 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
1ef30 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
1ef40 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
1ef50 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1ef60 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
1ef70 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1ef80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ef90 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1efa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1efb0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1efc0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1efd0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1efe0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
1eff0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
1f000 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1f010 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1f020 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1f030 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
1f040 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1f050 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1f060 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1f070 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1f080 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1f090 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1f0a0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
1f0b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
1f0c0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1f0d0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
1f0e0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
1f0f0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
1f100 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
1f110 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1f120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1f130 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f140 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1f150 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
1f160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f170 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1f180 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
1f190 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
1f1a0 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
1f1b0 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
1f1c0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
1f1d0 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
1f1e0 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
1f1f0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
1f200 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
1f210 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
1f220 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
1f230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f240 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
1f250 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
1f260 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1f270 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
1f280 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1f290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f2a0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1f2b0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1f2c0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1f2d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1f2e0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f2f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f300 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
1f310 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1f320 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1f330 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f340 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f350 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1f360 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1f370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f380 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1f390 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1f3a0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
1f3b0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1f3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f3e0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
1f3f0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
1f400 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
1f410 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
1f420 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
1f430 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
1f440 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
1f450 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
1f460 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
1f470 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
1f480 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
1f490 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
1f4a0 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
1f4b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
1f4c0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
1f4d0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1f4e0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
1f4f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f500 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1f510 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
1f520 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
1f530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f550 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1f560 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f570 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f580 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f590 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
1f5a0 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
1f5b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f5c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1f5e0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1f5f0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1f600 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1f610 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1f620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f630 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1f640 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1f650 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1f660 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
1f670 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
1f680 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
1f690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
1f6a0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
1f6b0 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
1f6c0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
1f6d0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
1f6e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1f6f0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1f700 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1f710 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1f720 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1f730 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1f740 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
1f750 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
1f760 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1f770 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1f780 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1f790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f7a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f7b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f7c0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
1f7d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f7e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f7f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1f800 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1f810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1f820 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1f830 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1f840 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
1f850 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1f860 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1f870 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1f880 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1f890 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1f8a0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1f8b0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1f8c0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
1f8d0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1f8e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
1f8f0 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
1f900 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
1f910 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74       int closest
1f920 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
1f930 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
1f940 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
1f950 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
1f960 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ta;.        rc =
1f970 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f980 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1f990 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1f9a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1f9b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1f9c0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1f9d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
1f9e0 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
1f9f0 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74       int i, dist
1fa00 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
1fa10 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1fa20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
1fa30 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
1fa40 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
1fa50 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
1fa60 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
1fa70 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
1fa80 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
1fa90 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
1faa0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1fab0 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
1fac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1fad0 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
1fae0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
1faf0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
1fb10 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
1fb20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
1fb30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1fb40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fb50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fb60 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
1fb70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1fb80 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
1fb90 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
1fba0 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
1fbb0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
1fbc0 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
1fbd0 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
1fbe0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20    Pgno nPage;.  
1fbf0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1fc00 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1fc10 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50    nPage = pagerP
1fc20 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1fc30 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50           if( *pP
1fc40 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  gno>nPage ){.   
1fc50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
1fc60 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e   page off the en
1fc70 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
1fc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fc90 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1fca0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1fcb0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1fcc0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1fcd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1fce0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1fcf0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
1fd00 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
1fd10 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
1fd20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
1fd30 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
1fd60 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
1fd70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1fd80 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
1fd90 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
1fda0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
1fdb0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
1fdc0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
1fdd0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1fde0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1fdf0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
1fe00 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
1fe10 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1fe20 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
1fe30 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
1fe40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1fe50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1fe60 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1fe70 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
1fe80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fe90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fea0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1feb0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1fec0 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  k((*ppPage)->pDb
1fed0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1fee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fef0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1ff00 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1ff10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1ff20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1ff40 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1ff50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1ff60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1ff70 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1ff80 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1ff90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1ffa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1ffb0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
1ffc0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
1ffd0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
1ffe0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
1fff0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
20000 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
20010 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
20020 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
20030 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
20040 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
20050 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
20060 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
20070 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67  t(pBt);.    *pPg
20080 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a  no = nPage + 1;.
20090 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
200a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
200b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
200c0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
200d0 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68  An incr-vacuum h
200e0 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77  as already run w
200f0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
20100 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20  action. So the. 
20110 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20       ** page to 
20120 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20  allocate is not 
20130 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61  from the physica
20140 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  l end of the fil
20150 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  e, but.      ** 
20160 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20  at pBt->nTrunc. 
20170 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20180 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54  *pPgno = pBt->nT
20190 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66  runc+1;.      if
201a0 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
201b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
201c0 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50   ){.        (*pP
201d0 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  gno)++;.      }.
201e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
201f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
20200 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
20210 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
20220 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
20230 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
20240 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
20250 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
20260 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
20270 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
20280 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
20290 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
202a0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
202b0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
202c0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
202d0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
202e0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
202f0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
20300 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
20310 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
20320 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
20330 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
20340 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
20350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
20360 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
20370 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
20380 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
20390 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
203a0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
203b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
203c0 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
203d0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
203e0 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
203f0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
20400 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
20410 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
20420 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
20430 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20440 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20450 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
20460 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
20470 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
20480 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
204a0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
204b0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
204c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
204d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
204e0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
204f0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
20500 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
20510 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
20520 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
20530 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
20540 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
20550 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20560 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
20570 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
20580 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
20590 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
205a0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
205b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
205c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
205d0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
205e0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
205f0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
20600 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
20610 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
20620 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20630 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
20640 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
20650 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
20660 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20670 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
20680 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20690 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
206a0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
206b0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
206c0 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
206d0 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
206e0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
206f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
20700 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20710 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20720 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
20730 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
20740 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
20750 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
20760 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
20770 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  g */.  assert( s
20780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20790 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
207a0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
207b0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
207c0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  );.  pPage->isIn
207d0 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  it = 0;..  /* In
207e0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
207f0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
20800 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
20810 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20820 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
20830 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
20840 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20  eturn rc;.  n = 
20850 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
20860 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
20870 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20880 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31  ->aData[36], n+1
20890 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
208a0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
208b0 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
208c0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
208d0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
208e0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
208f0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
20900 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
20910 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
20920 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
20930 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
20940 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20950 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
20960 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
20970 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
20980 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
20990 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
209a0 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
209b0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
209c0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
209d0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
209e0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
209f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
20a00 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
20a10 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
20a20 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
20a30 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
20a40 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
20a50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70  ut(pBt, pPage->p
20a60 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  gno, PTRMAP_FREE
20a70 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
20a80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
20a90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 3d 3d  ;.  }..  if( n==
20aa0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
20ab0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72   is the first fr
20ac0 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  ee page */.    r
20ad0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20ae0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
20af0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20b00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20b10 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
20b20 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
20b30 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20b40 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20b50 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
20b60 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
20b70 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
20b80 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
20b90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
20ba0 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
20bb0 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
20bc0 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
20bd0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
20be0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
20bf0 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
20c00 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
20c10 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
20c20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
20c30 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
20c40 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
20c50 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
20c60 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20c70 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  ), &pTrunk, 0);.
20c80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20c90 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20  urn rc;.    k = 
20ca0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
20cb0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
20cc0 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61   if( k>=pBt->usa
20cd0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
20ce0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72  .      /* The tr
20cf0 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75  unk is full.  Tu
20d00 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  rn the page bein
20d10 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e  g freed into a n
20d20 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  ew.      ** trun
20d30 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c  k page with no l
20d40 65 61 76 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  eaves..      **.
20d50 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
20d60 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
20d70 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
20d80 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
20d90 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
20da0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
20db0 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
20dc0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
20dd0 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
20de0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
20df0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
20e00 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
20e10 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
20e20 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
20e30 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
20e40 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
20e50 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
20e60 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
20e70 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
20e80 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
20e90 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
20ea0 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
20eb0 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
20ec0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
20ed0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
20ee0 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
20ef0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
20f00 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
20f10 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  we will contain 
20f20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
20f30 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
20f40 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
20f50 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
20f60 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
20f70 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
20f80 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
20f90 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
20fa0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
20fb0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
20fc0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
20fd0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
20fe0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
20ff0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
21000 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
21010 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
21020 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
21030 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
21040 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
21050 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
21060 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21080 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
21090 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72  Page->aData, pTr
210a0 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  unk->pgno);.    
210b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
210c0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
210d0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
210e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
210f0 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
21100 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52  gno);.        TR
21110 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
21120 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
21130 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
21140 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21150 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
21160 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b   pTrunk->pgno));
21170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
21180 73 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20  se if( k<0 ){.  
21190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
211a0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
211b0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64  se{.      /* Add
211c0 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64   the newly freed
211d0 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20   page as a leaf 
211e0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
211f0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  runk */.      rc
21200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
21210 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
21220 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
21230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21240 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
21250 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
21260 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20  a[4], k+1);.    
21270 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
21280 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a  runk->aData[8+k*
21290 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  4], pPage->pgno)
212a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
212b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
212c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
212d0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
212e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
212f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
21300 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
21310 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
21320 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
21330 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
21340 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
21350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
21360 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
21370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21380 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
21390 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
213a0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
213b0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
213c0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
213d0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
213e0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
213f0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
21400 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21410 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
21420 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
21430 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
21440 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
21450 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
21460 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
21470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21480 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
21490 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
214a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
214b0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
214c0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
214d0 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
214e0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
214f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21500 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
21510 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
21520 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
21530 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
21540 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
21550 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
21560 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
21570 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
21580 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21590 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
215a0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
215b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
215c0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
215d0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
215e0 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
215f0 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
21600 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
21610 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  -- ){.    MemPag
21620 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
21630 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
21640 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
21650 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
21660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21670 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21680 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  T;.    }..    rc
21690 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
216a0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
216b0 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c  , &pOvfl, (nOvfl
216c0 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f  ==0)?0:&ovflPgno
216d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
216e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
216f0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76  c = freePage(pOv
21700 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fl);.    sqlite3
21710 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
21720 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21730 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
21740 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
21750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21760 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
21770 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
21780 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
21790 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
217a0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
217b0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
217c0 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
217d0 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
217e0 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
217f0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
21800 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
21810 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
21820 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
21830 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
21840 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
21850 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
21860 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
21870 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
21880 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
21890 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
218a0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
218b0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
218c0 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
218d0 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
218e0 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
218f0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
21900 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
21910 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
21920 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
21930 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
21940 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
21950 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
21960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
21970 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
21980 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
21990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
219a0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
219b0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
219c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
219d0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
219e0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
219f0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
21a00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21a10 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
21a20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
21a30 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
21a40 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
21a50 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
21a60 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
21a90 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
21aa0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
21ab0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
21ad0 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
21ae0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
21af0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
21b00 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
21b10 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
21b20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
21b30 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
21b40 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
21b50 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
21b60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21b70 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
21b80 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
21b90 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
21ba0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
21bb0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
21bc0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
21bd0 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
21be0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
21bf0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21c00 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
21c10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
21c20 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
21c30 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
21c40 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
21c50 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
21c60 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
21c70 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
21c80 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
21c90 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
21ca0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
21cb0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
21cc0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
21cd0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
21ce0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
21cf0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
21d00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
21d10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
21d20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
21d30 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
21d40 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
21d50 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
21d60 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
21d70 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
21d80 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
21d90 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
21da0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
21db0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
21dc0 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
21dd0 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
21de0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
21df0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
21e00 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
21e10 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
21e20 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Key);.  sqlite3B
21e30 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21e40 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
21e50 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
21e60 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
21e70 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
21e80 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
21e90 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
21ea0 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
21eb0 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
21ec0 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
21ed0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
21ee0 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
21ef0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
21f00 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
21f10 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
21f20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
21f30 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
21f40 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
21f50 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
21f60 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20   nKey;.    pSrc 
21f70 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
21f80 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a   = nKey;.  }.  *
21f90 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
21fa0 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
21fb0 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
21fc0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
21fd0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
21fe0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
21ff0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
22000 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
22010 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
22020 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
22030 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61  .      int isExa
22040 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ct = 0;.#ifndef 
22050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
22060 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
22070 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
22080 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
22090 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
220a0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
220b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
220c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
220d0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
220e0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
220f0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
22100 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
22110 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
22120 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
22130 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
22140 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
22150 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
22160 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c      if( pgnoOvfl
22170 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
22180 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20  /* isExact = 1; 
22190 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
221a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
221b0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
221c0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
221d0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
221e0 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61   pgnoOvfl, isExa
221f0 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
22200 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22210 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
22220 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
22230 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
22240 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
22250 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
22260 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
22270 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
22280 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
22290 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
222a0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
222b0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
222c0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
222d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
222e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
222f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
22300 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
22310 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
22320 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
22330 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
22340 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
22350 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
22360 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
22370 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
22380 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
22390 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
223a0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
223b0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
223c0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
223d0 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e  alised values an
223e0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
223f0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
22400 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
22410 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
22420 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
22430 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
22440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22450 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
22460 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
22470 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
22480 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
22490 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
224a0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
224b0 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
224c0 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20  Ptrmap);.       
224d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
224e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
224f0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
22500 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
22510 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
22520 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
22530 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
22540 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
22550 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
22560 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
22570 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
22580 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
22590 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
225a0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
225b0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
225c0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
225d0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
225e0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
225f0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
22600 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
22610 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
22620 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
22630 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
22640 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
22650 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
22660 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
22670 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
22680 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
22690 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
226a0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
226b0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
226c0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
226d0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
226e0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
226f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
22700 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
22710 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
22720 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
22730 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
22740 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
22750 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22760 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
22770 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
22780 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
22790 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
227a0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
227b0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
227c0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
227d0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
227e0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
227f0 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
22800 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
22810 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
22820 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
22830 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
22840 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
22850 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
22860 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
22870 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
22880 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
22890 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
228a0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
228b0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
228c0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
228d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
228e0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
228f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
22900 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
22910 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
22920 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
22930 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
22940 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
22950 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
22960 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
22970 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
22980 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
22990 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
229a0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
229b0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
229c0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
229d0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
229e0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
229f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
22a00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
22a10 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
22a20 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
22a30 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
22a40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
22a50 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
22a60 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
22a70 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
22a80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
22a90 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
22aa0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
22ab0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
22ac0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
22ad0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
22ae0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
22af0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
22b00 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
22b10 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
22b20 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
22b30 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
22b40 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
22b50 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
22b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
22b80 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
22b90 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
22ba0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
22bb0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
22bc0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
22bd0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
22be0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
22bf0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
22c00 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
22c10 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
22c20 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
22c30 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
22c40 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
22c50 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
22c60 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
22c70 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
22c80 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
22c90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22ca0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
22cb0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70  .static int drop
22cc0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
22cd0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
22ce0 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
22cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22d00 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
22d10 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
22d20 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
22d30 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
22d40 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
22d50 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
22d60 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
22d70 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
22d80 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22d90 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
22da0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
22db0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
22dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
22dd0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
22de0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
22df0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
22e00 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
22e10 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
22e20 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
22e30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
22e40 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
22e50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
22e60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22e70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22e80 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
22e90 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
22ea0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
22eb0 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
22ec0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
22ed0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
22ee0 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66  2byte(ptr);.  if
22ef0 28 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72  ( (pc<pPage->hdr
22f00 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
22f10 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20  >leaf?0:4)).    
22f20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65   || (pc+sz>pPage
22f30 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
22f40 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
22f50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
22f60 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
22f70 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
22f80 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
22f90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22fa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
22fb0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78  .  }.  for(i=idx
22fc0 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  +1; i<pPage->nCe
22fd0 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29  ll; i++, ptr+=2)
22fe0 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70  {.    ptr[0] = p
22ff0 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31  tr[2];.    ptr[1
23000 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a  ] = ptr[3];.  }.
23010 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
23020 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
23030 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
23040 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
23050 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
23060 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65  nFree += 2;.  re
23070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23080 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
23090 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
230a0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
230b0 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
230c0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
230d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
230e0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
230f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
23100 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
23110 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
23120 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
23130 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
23140 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
23150 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
23160 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
23170 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
23180 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
23190 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
231a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
231b0 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
231c0 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
231d0 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
231e0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
231f0 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
23200 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
23210 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
23220 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
23230 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
23240 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
23250 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
23260 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
23270 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
23280 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
23290 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
232a0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
232b0 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
232c0 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
232d0 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
232e0 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
232f0 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
23300 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
23310 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23320 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
23330 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
23340 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
23350 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
23360 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
23370 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
23380 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
23390 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
233a0 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c  ic int insertCel
233b0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
233c0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
233d0 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
233e0 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
233f0 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
23400 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
23410 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
23420 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
23430 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
23440 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
23450 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
23460 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
23470 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
23480 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
23490 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
234a0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
234b0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
234c0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
234d0 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53  eeded */.  u8 nS
234e0 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  kip          /* 
234f0 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  Do not write the
23500 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
23510 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  es of the cell *
23520 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
23530 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
23540 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
23550 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
23560 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
23570 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23580 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
23590 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
235a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
235b0 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72  e of content for
235c0 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74   any cell in dat
235d0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  a[] */.  int end
235e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
235f0 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
23600 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
23610 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
23620 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
23630 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
23640 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
23650 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
23660 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
23670 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
23680 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
23690 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70   data[] of the p
236a0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
236b0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
236c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
236d0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
236e0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
236f0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
23700 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
23710 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
23720 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
23730 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
23740 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
23750 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
23760 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
23770 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
23780 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
23790 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
237a0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
237b0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
237c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
237d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
237e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
237f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23800 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
23810 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
23820 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
23830 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
23840 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
23850 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
23860 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
23870 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
23880 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
23890 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
238a0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
238b0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
238c0 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
238d0 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
238e0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
238f0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
23900 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
23910 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
23920 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69  aOvfl[j].idx = i
23930 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
23940 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
23950 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
23960 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23970 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
23980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
239a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
239b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
239c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
239d0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
239e0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
239f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
23a00 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
23a10 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
23a20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
23a30 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
23a40 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
23a50 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
23a60 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
23a70 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
23a80 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20  e->nCell + 2;.  
23a90 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
23aa0 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66  et + 2*i;.    if
23ab0 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a  ( end > top - sz
23ac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   ){.      rc = d
23ad0 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
23ae0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
23af0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23b00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23b10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
23b20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
23b30 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
23b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
23b50 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b  d + sz <= top );
23b60 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d  .    }.    idx =
23b70 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
23b80 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61  Page, sz);.    a
23b90 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a  ssert( idx>0 );.
23ba0 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
23bb0 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74  <= get2byte(&dat
23bc0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20  a[hdr+5]) );.   
23bd0 20 69 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50   if (idx+sz > pP
23be0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
23bf0 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65  Size) {.      re
23c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23c10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
23c20 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
23c30 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
23c40 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
23c50 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
23c60 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
23c70 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
23c80 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
23c90 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
23ca0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
23cb0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
23cc0 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
23cd0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
23ce0 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
23cf0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
23d00 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
23d10 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23d20 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
23d30 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
23d40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23d50 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
23d60 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
23d70 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
23d80 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
23d90 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
23da0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
23db0 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
23dc0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
23dd0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
23de0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
23df0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
23e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c      */.      Cel
23e10 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
23e20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
23e30 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
23e40 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
23e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23e60 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
23e70 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
23e80 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
23e90 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20  ayload );.      
23ea0 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
23eb0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
23ec0 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
23ed0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
23ee0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
23ef0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
23f00 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
23f10 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ow]);.        rc
23f20 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
23f30 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
23f40 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
23f50 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
23f60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23f70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
23f80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
23f90 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
23fa0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
23fb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23fc0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
23fd0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
23fe0 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
23ff0 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
24000 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
24010 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
24020 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
24030 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
24040 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
24050 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
24060 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
24070 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
24080 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
24090 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
240a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
240b0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
240c0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
240d0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
240e0 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
240f0 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
24100 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
24110 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
24120 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
24130 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
24140 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
24150 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
24160 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
24170 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
24180 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
24190 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
241a0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
241b0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
241c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
241d0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
241e0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
241f0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
24200 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
24210 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
24220 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
24230 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
24240 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
24250 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
24260 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
24270 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
24280 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
24290 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
242a0 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
242b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
242c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
242d0 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
242e0 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
242f0 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
24300 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
24310 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
24320 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
24330 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24340 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
24350 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
24360 67 65 29 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ge) );.  cellptr
24370 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
24380 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
24390 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
243a0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
243b0 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
243c0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
243d0 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
243e0 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
243f0 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
24400 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
24410 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
24420 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
24430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24440 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
24450 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
24460 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
24470 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
24480 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
24490 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
244a0 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
244b0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
244c0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
244d0 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
244e0 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
244f0 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
24500 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
24510 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
24520 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24530 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
24540 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
24550 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
24560 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
24570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
24580 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
24590 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
245a0 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
245b0 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
245c0 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
245d0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
245e0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
245f0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
24600 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
24610 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
24620 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
24630 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
24640 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
24650 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
24660 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
24670 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
24680 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
24690 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
246a0 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
246b0 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
246c0 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
246d0 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
246e0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
246f0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
24700 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
24710 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
24720 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
24730 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
24740 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
24750 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
24760 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
24770 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
24780 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
24790 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
247a0 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
247b0 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
247c0 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
247d0 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
247e0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
247f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
24800 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
24810 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
24820 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
24830 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
24840 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
24850 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
24860 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  nce */../* Forwa
24870 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
24880 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
24890 63 65 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e  ce(BtCursor*, in
248a0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
248b0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
248c0 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
248d0 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
248e0 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
248f0 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
24900 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
24910 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
24920 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
24930 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
24940 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
24950 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
24960 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
24970 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
24980 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
24990 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
249a0 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
249b0 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62  tead of trying b
249c0 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
249d0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
249e0 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
249f0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
24a00 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
24a10 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
24a20 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
24a30 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
24a40 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
24a50 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
24a60 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
24a70 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
24a80 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
24a90 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
24aa0 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
24ab0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
24ac0 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
24ad0 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
24ae0 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
24af0 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
24b00 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
24b10 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
24b20 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
24b30 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
24b40 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
24b50 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
24b60 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
24b70 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
24b80 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
24b90 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
24ba0 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
24bb0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
24bc0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
24bd0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
24be0 5f 71 75 69 63 6b 28 42 74 43 75 72 73 6f 72 20  _quick(BtCursor 
24bf0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
24c00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
24c10 77 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67  w = 0;.  Pgno pg
24c20 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65  noNew;.  u8 *pCe
24c30 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c  ll;.  u16 szCell
24c40 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
24c50 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  o;.  MemPage *pP
24c60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24c70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24c80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
24c90 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
24ca0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
24cb0 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ];.  BtShared *p
24cc0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
24cd0 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
24ce0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
24cf0 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
24d00 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
24d10 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
24d20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d40 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
24d50 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
24d60 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
24d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24d80 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
24d90 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
24da0 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
24db0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24dc0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
24dd0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
24de0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
24df0 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
24e00 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
24e10 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
24e20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
24e30 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
24e40 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
24e50 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
24e60 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
24e70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
24e80 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
24e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24ea0 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  ){.    pCell = p
24eb0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
24ec0 43 65 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c  Cell;.    szCell
24ed0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
24ee0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
24ef0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24f00 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24f10 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
24f20 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
24f30 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44  (pNew, pPage->aD
24f40 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73  ata[0]);.    ass
24f50 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
24f60 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
24f70 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
24f80 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
24f90 20 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69   .    /* pPage i
24fa0 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
24fb0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
24fc0 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74  Parent. Change t
24fd0 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  his.    ** so th
24fe0 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  at the right-chi
24ff0 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61  ld is the new pa
25000 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  ge allocated abo
25010 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50  ve and.    ** pP
25020 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
25030 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
25040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
25050 67 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e  gnore the return
25060 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61   value of the ca
25070 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c  ll to fillInCell
25080 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  (). fillInCell()
25090 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79  .    ** may only
250a0 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68   return other th
250b0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
250c0 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74  it is required t
250d0 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a  o allocate.    *
250e0 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  * one or more ov
250f0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69  erflow pages. Si
25100 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  nce an internal 
25110 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c  table B-Tree cel
25120 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65  l .    ** may ne
25130 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f  ver spill over o
25140 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nto an overflow 
25150 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d 61  page (it is a ma
25160 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a  ximum of .    **
25170 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
25180 65 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  e), it is not ne
25190 63 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63  ccessary to chec
251a0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
251b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
251c0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
251d0 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e  insertCell() fun
251e0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
251f0 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20  l if the page.  
25200 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72    ** being inser
25210 74 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65  ted into is alre
25220 61 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64  ady writable and
25230 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
25240 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ot .    ** conta
25250 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  in an overflow p
25260 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72  ointer. So ignor
25270 65 20 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f  e this return co
25280 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  de too..    */. 
25290 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
252a0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
252b0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
252c0 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
252d0 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71  nCell-1);.    sq
252e0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
252f0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
25300 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
25310 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
25320 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
25330 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
25340 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53  , 0, 0, &parentS
25350 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
25360 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20  ( parentSize<64 
25370 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
25380 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25390 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
253a0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
253b0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
253c0 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70  nt, parentIdx, p
253d0 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e  arentCell, paren
253e0 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20  tSize, 0, 4);.  
253f0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
25400 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
25410 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20  ent,parentIdx), 
25420 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
25430 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
25440 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
25450 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
25460 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20  , pgnoNew);.  . 
25470 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
25480 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
25490 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
254a0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
254b0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
254c0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
254d0 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
254e0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
254f0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
25500 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
25510 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
25520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
25530 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
25540 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
25550 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
25560 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
25570 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
25580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
255a0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
255b0 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20  vfl(pNew, 0);.  
255c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
255d0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
255e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
255f0 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
25600 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
25610 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ew);.  }..  /* A
25620 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
25630 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61   pPage->nFree va
25640 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
25650 74 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68  t correctly with
25660 0a 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f  .  ** respect to
25670 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
25680 74 68 65 20 70 61 67 65 20 28 62 65 63 61 75 73  the page (becaus
25690 65 20 69 74 20 77 61 73 20 73 65 74 20 74 6f 20  e it was set to 
256a0 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72  0 by .  ** inser
256b0 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20  tCell). So call 
256c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
256d0 50 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73  Page() to make s
256e0 75 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63  ure it is.  ** c
256f0 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a  orrect..  **.  *
25700 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
25710 20 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e   done even if an
25720 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
25730 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c  eturned. Normall
25740 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72  y, if.  ** an er
25750 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
25760 67 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67  g tree balancing
25770 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
25780 66 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20  f MemPage are.  
25790 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  ** not important
257a0 2c 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62  , as they will b
257b0 65 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77  e recalculated w
257c0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
257d0 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
257e0 2e 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62  . But here, in b
257f0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20  alance_quick(), 
25800 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
25810 68 61 74 20 70 50 61 67 65 20 68 61 73 20 0a 20  hat pPage has . 
25820 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
25830 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72   marked dirty or
25840 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
25850 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
25860 54 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69  Therefore.  ** i
25870 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f  t will not be ro
25880 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f  lled back and so
25890 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
258a0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
258b0 61 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  at.  ** the page
258c0 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e   data and conten
258d0 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72  ts of MemPage ar
258e0 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  e consistent..  
258f0 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  */.  pPage->isIn
25900 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
25910 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
25920 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Page);..  /* If 
25930 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20  everything else 
25940 73 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e  succeeded, balan
25950 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
25960 67 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73  ge, in .  ** cas
25970 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
25980 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73  ll inserted caus
25990 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20  ed it to become 
259a0 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20  overfull..  */. 
259b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
259c0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
259d0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
259e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
259f0 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
25a00 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a  e(pCur, 0);.  }.
25a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
25a20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25a30 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
25a40 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
25a50 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
25a60 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20  ibutes Cells on 
25a70 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
25a80 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  NN*2 siblings.**
25a90 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61   of pPage so tha
25aa0 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
25ab0 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20   about the same 
25ac0 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
25ad0 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  pace..** Usually
25ae0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
25af0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
25b00 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20  Page is used in 
25b10 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a  the balancing,.*
25b20 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69  * though more si
25b30 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
25b40 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20  e from one side 
25b50 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
25b60 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74  first.** or last
25b70 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
25b80 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20  rent.  If pPage 
25b90 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
25ba0 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  *NN siblings.** 
25bb0 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
25bc0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
25bd0 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
25be0 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
25bf0 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f  .** child of roo
25c00 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  t) then all avai
25c10 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70  lable siblings p
25c20 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
25c30 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
25c40 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
25c50 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
25c60 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
25c70 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
25c80 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20  ed by one or.** 
25c90 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
25ca0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
25cb0 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
25cc0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68  ot over full. Th
25cd0 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
25ce0 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73  s special and is
25cf0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e   allowed to be n
25d00 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20  early empty. If 
25d10 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65  pPage is .** the
25d20 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
25d30 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
25d40 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20  e tree might be 
25d50 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20  increased.** or 
25d60 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
25d70 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20  , as necessary, 
25d80 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74  to keep the root
25d90 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
25da0 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  .** overfull or 
25db0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
25dc0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
25dd0 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
25de0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
25df0 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73  ome of the Cells
25e00 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   on pPage.** mig
25e10 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
25e20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  be stored in pPa
25e30 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68  ge->aData[].  Th
25e40 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
25e50 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
25e60 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20  overfull.  Part 
25e70 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68  of the job of th
25e80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
25e90 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  .** make sure al
25ea0 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67  l Cells for pPag
25eb0 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74  e once again fit
25ec0 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
25ed0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  []..**.** In the
25ee0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
25ef0 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67  cing the sibling
25f00 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20  s of pPage, the 
25f10 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a  parent of pPage.
25f20 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  ** might become 
25f30 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
25f40 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20  rfull.  If that 
25f50 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68  happens, then th
25f60 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
25f70 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
25f80 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ely on the paren
25f90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
25fa0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
25fb0 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
25fc0 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
25fd0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
25fe0 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
25ff0 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  te.  So if this 
26000 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
26010 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
26020 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
26030 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
26040 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
26050 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
26060 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
26070 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
26080 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20      /* The over 
26090 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67  or underfull pag
260a0 65 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  e to balance */.
260b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
260c0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
260d0 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20  * The parent of 
260e0 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61  pPage */.  BtSha
260f0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
26100 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
26110 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
26120 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
26130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26140 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
26150 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
26160 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
26170 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
26180 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
26190 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
261a0 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
261b0 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
261e0 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
261f0 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
26220 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
26230 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20    int nDiv;     
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26250 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
26260 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a  s in apDiv[] */.
26270 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26290 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
262a0 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50    /* Index of pP
262d0 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  age in pParent->
262e0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
262f0 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
26300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
26310 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
26320 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
26330 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
26360 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
26370 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
26380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
26390 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
263a0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
263b0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263d0 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
263e0 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
263f0 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
26400 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
26410 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
26420 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
26430 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
26440 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
26450 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
26460 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
26470 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
26480 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
26490 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
264a0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
264b0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
264c0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
264d0 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
264e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
264f0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
26500 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
26510 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
26520 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
26530 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
26540 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
26550 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  e2[] */.  int sz
26560 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20  Scratch;        
26570 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
26580 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  f scratch memory
26590 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
265a0 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e  MemPage *apOld[N
265b0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  B];          /* 
265c0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
265d0 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  two siblings */.
265e0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e    Pgno pgnoOld[N
265f0 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  B];            /
26600 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
26610 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
26620 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  apOld[] */.  Mem
26630 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
26640 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
26650 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
26660 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
26670 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
26680 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
26690 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
266a0 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
266b0 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
266c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b  .  Pgno pgnoNew[
266d0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
266e0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20  /* Page numbers 
266f0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
26700 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38   apNew[] */.  u8
26710 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20   *apDiv[NB];    
26720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
26730 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
26740 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
26750 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
26760 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26770 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
26780 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
26790 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
267a0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
267b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
267c0 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
267d0 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
267e0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
267f0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
26800 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
26810 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
26820 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
26830 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
26840 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
26850 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
26860 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
26870 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20  u8 *aCopy[NB];  
26880 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
26890 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  for holding data
268a0 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a   of apCopy[] */.
268b0 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
268c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
268d0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
268e0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62  dividers cells b
268f0 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f  efore balance */
26900 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d  .  u8 *aSpace2 =
26910 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61   0;       /* Spa
26920 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ce for overflow 
26930 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
26940 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  fter balance */.
26950 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b    u8 *aFrom = 0;
26960 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
26970 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26980 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
26990 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
269a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
269b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f  mutex) );.  VVA_
269c0 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
269d0 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
269e0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
269f0 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
26a00 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
26a10 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
26a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26a30 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
26a40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
26a50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
26a60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
26a70 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
26a80 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20  low==1 );.  pBt 
26a90 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
26aa0 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
26ab0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26ac0 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge-1];.  assert(
26ad0 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
26ae0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
26af0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26b00 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
26b10 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
26b20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
26b30 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
26b40 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
26b50 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
26b60 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
26b70 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
26b80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26b90 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
26ba0 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
26bb0 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
26bc0 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
26bd0 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
26be0 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
26bf0 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
26c00 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
26c10 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
26c20 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
26c30 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
26c40 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
26c50 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
26c60 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
26c70 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
26c80 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
26c90 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
26ca0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
26cb0 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
26cc0 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
26cd0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
26ce0 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
26cf0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
26d00 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
26d10 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
26d20 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
26d30 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
26d40 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
26d50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
26d60 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
26d70 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
26d80 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
26d90 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
26da0 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
26db0 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
26dc0 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
26dd0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
26de0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
26df0 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
26e00 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73  pgno.  ){.    as
26e10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
26e20 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20  Key );.    /*.  
26e30 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
26e40 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
26e50 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
26e60 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
26e70 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
26e80 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
26e90 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
26ea0 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
26eb0 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
26ec0 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b 0a  ce_quick(pCur);.
26ed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
26ee0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
26ef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26f00 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
26f10 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  age)) ){.    ret
26f20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
26f30 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
26f40 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65  cell in the pare
26f50 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65  nt page whose le
26f60 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  ft child points 
26f70 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61  back.  ** to pPa
26f80 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76  ge.  The "idx" v
26f90 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69  ariable is the i
26fa0 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c  ndex of that cel
26fb0 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a  l.  If pPage.  *
26fc0 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f  * is the rightmo
26fd0 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
26fe0 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78  ent then set idx
26ff0 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   to pParent->nCe
27000 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d  ll .  */.  idx =
27010 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27020 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61  r->iPage-1];.  a
27030 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
27040 28 70 50 61 72 65 6e 74 2c 20 69 64 78 2c 20 70  (pParent, idx, p
27050 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  Page->pgno);..  
27060 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  /*.  ** Initiali
27070 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20  ze variables so 
27080 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
27090 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a  safe to jump.  *
270a0 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61  * directly to ba
270b0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74  lance_cleanup at
270c0 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a   any moment..  *
270d0 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20  /.  nOld = nNew 
270e0 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  = 0;..  /*.  ** 
270f0 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
27100 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
27110 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
27120 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
27130 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
27140 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
27150 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
27160 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
27170 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
27180 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
27190 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
271a0 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
271b0 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
271c0 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
271d0 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
271e0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
271f0 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
27200 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
27210 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
27220 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
27230 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
27240 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
27250 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
27260 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
27270 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
27280 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
27290 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
272a0 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
272b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
272c0 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
272d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
272e0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
272f0 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
27300 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
27310 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
27320 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
27330 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
27340 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
27350 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
27360 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
27370 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
27380 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
27390 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
273a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
273b0 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
273c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
273d0 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
273e0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
273f0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27400 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
27410 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
27420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27430 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
27440 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
27450 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
27460 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
27470 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27480 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d      /* apOld[i]-
27490 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20  >idxParent = k; 
274a0 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d  */.    apCopy[i]
274b0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
274c0 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20  ( i==nOld );.   
274d0 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61   nOld++;.    nMa
274e0 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
274f0 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
27500 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
27510 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
27520 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
27530 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
27540 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
27550 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
27560 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
27570 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
27580 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
27590 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
275a0 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
275b0 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
275c0 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
275d0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
275e0 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
275f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27600 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
27610 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
27620 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
27650 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65    + (ROUND8(size
27660 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74  of(MemPage))+pBt
27670 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20  ->pageSize)*NB  
27680 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
27690 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
276c0 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
276d0 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
276e0 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
276f0 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
27700 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70  /* aFrom */.  ap
27710 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
27720 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
27730 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
27740 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
27750 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27760 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
27770 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
27780 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
27790 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
277a0 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
277b0 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
277c0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
277d0 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
277e0 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
277f0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
27800 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
27810 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
27820 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
27830 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
27840 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
27850 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
27860 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
27870 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
27880 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
27890 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
278a0 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
278b0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
278c0 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
278d0 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e  pace1 = &aCopy[N
278e0 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  B-1][pBt->pageSi
278f0 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
27900 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61  (MemPage))];.  a
27910 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65 31  ssert( ((aSpace1
27920 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
27930 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
27940 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
27950 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28  equired */.  if(
27960 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
27970 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
27980 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
27990 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61  ize];.  }.  aSpa
279a0 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ce2 = sqlite3Pag
279b0 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67  eMalloc(pBt->pag
279c0 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53  eSize);.  if( aS
279d0 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20  pace2==0 ){.    
279e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
279f0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
27a00 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
27a10 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
27a20 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
27a30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
27a40 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
27a50 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
27a60 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
27a70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
27a80 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
27a90 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
27aa0 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
27ab0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
27ac0 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
27ad0 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
27ae0 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
27af0 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
27b00 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
27b10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
27b20 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
27b30 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
27b40 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
27b50 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d  )aCopy[i];.    m
27b60 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69  emcpy(p, apOld[i
27b70 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
27b80 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  e));.    p->aDat
27b90 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d  a = (void*)&p[1]
27ba0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
27bb0 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
27bc0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
27bd0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
27be0 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
27bf0 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
27c00 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
27c10 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
27c20 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
27c30 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
27c40 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
27c50 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
27c60 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
27c70 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
27c80 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
27c90 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
27ca0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
27cb0 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
27cc0 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
27cd0 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
27ce0 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
27cf0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
27d00 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
27d10 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
27d20 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
27d30 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
27d40 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
27d50 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
27d60 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
27d70 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
27d80 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
27d90 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
27da0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
27db0 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
27dc0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
27dd0 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
27de0 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
27df0 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
27e00 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
27e10 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
27e20 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
27e30 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
27e40 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
27e50 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
27e60 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
27e70 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
27e80 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
27e90 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
27ea0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
27eb0 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
27ec0 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
27ed0 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
27ee0 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
27ef0 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
27f00 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
27f10 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68  fData = pPage->h
27f20 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
27f30 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
27f40 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
27f50 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
27f60 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
27f70 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
27f80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
27f90 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
27fa0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
27fb0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
27fc0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27fd0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
27fe0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
27ff0 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
28000 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
28010 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
28020 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
28030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  );.      if( ISA
28040 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
28050 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
28060 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
28070 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
28080 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
28090 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
280a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
280b0 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
280c0 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
280d0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
280e0 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
280f0 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
28100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
28110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
28130 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll++;.    }.    
28140 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a  if( i<nOld-1 ){.
28150 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63        u16 sz = c
28160 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
28170 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
28180 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
28190 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
281a0 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54  With the LEAFDAT
281b0 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20  A flag, pParent 
281c0 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20  cells hold only 
281d0 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20  INTKEYs that.   
281e0 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c       ** are dupl
281f0 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f  icates of keys o
28200 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
28210 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  s.  We need to r
28220 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a  emove.        **
28230 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
28240 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c  ls from pParent,
28250 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72   but the divider
28260 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a  s cells are not.
28270 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
28280 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63   to apCell[] bec
28290 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75  ause they are du
282a0 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c  plicates of chil
282b0 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20  d cells..       
282c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70   */.        drop
282d0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
282e0 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
282f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
28300 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
28310 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
28320 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28330 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
28340 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  l] = sz;.       
28350 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
28360 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
28370 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
28380 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
28390 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
283a0 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
283b0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
283c0 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
283d0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
283e0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
283f0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
28400 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
28410 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
28420 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
28430 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
28440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
28450 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
28460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28470 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
28480 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
28490 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
284a0 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43  [nCell] -= leafC
284b0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
284c0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
284d0 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
284e0 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
284f0 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
28500 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
28510 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
28520 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
28530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
28540 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
28550 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
28560 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
28570 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
28580 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
28590 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
285a0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
285b0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
285c0 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
285d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
285e0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
285f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
28600 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
28610 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
28620 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
28630 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
28640 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
28650 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
28660 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
28670 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
28680 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
28690 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
286a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
286b0 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
286c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
286d0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
286e0 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
286f0 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
28700 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
28710 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
28720 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
28730 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
28740 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
28750 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
28760 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
28770 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
28780 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
28790 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
287a0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
287b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
287c0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
287d0 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
287e0 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
287f0 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
28800 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
28810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
28820 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
28830 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
28840 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
28850 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
28860 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
28870 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
28880 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
28890 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
288a0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
288b0 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
288c0 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
288d0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
288e0 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
288f0 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
28900 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
28910 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
28920 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
28930 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
28940 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
28950 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
28960 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
28970 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
28980 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
28990 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
289a0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
289b0 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
289c0 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
289d0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
289e0 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
289f0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
28a00 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
28a10 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
28a20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
28a30 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
28a40 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
28a50 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
28a60 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
28a70 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
28a80 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
28a90 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
28aa0 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
28ab0 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
28ac0 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
28ad0 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
28ae0 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
28af0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
28b00 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
28b10 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
28b20 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
28b30 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
28b40 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
28b50 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
28b60 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
28b70 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
28b80 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
28b90 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
28ba0 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
28bb0 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
28bc0 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
28bd0 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
28be0 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
28bf0 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
28c00 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
28c10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
28c20 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
28c30 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
28c40 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
28c50 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
28c60 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
28c70 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
28c80 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
28c90 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
28ca0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
28cb0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
28cc0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
28cd0 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
28ce0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
28cf0 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
28d00 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
28d10 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
28d20 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
28d30 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
28d40 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
28d50 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
28d60 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
28d70 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
28d80 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
28d90 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
28da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28db0 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
28dc0 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
28dd0 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
28de0 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
28df0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
28e00 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
28e10 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
28e20 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
28e30 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
28e40 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
28e50 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
28e60 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
28e70 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
28e80 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
28e90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
28ea0 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
28eb0 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
28ec0 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
28ed0 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
28ee0 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
28ef0 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
28f00 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
28f10 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
28f20 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
28f30 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
28f40 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
28f50 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
28f60 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
28f70 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
28f80 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
28f90 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
28fa0 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
28fb0 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
28fc0 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
28fd0 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
28fe0 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
28ff0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
29000 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
29010 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
29020 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
29030 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
29040 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
29050 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
29060 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
29070 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
29080 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
29090 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
290a0 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
290b0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
290c0 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
290d0 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
290e0 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
290f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
29100 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
29110 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
29120 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
29130 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
29140 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
29150 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
29160 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
29170 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
29180 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
29190 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
291a0 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
291b0 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
291c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
291d0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
291e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
291f0 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
29200 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
29210 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
29230 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
29240 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
29250 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
29260 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
29270 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
29280 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
29290 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
292a0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
292b0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
292c0 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
292d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
292e0 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
292f0 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
29300 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
29310 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
29320 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
29330 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
29340 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
29350 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
29360 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
29370 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
29380 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
29390 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
293a0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
293b0 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
293c0 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
293d0 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
293e0 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
293f0 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
29400 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
29410 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
29420 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
29430 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
29440 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
29450 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
29460 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
29470 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
29480 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
29490 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
294a0 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
294b0 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
294c0 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
294d0 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
294e0 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
294f0 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
29500 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
29510 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
29520 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
29530 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
29540 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
29550 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
29560 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
29570 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
29580 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
29590 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
295a0 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
295b0 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
295c0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
295d0 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
295e0 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
295f0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
29600 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
29610 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
29620 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
29630 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75  f( pgnoNew[j]<(u
29640 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
29650 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
29660 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
29670 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20   pgnoNew[j];.   
29680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
29690 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
296a0 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
296b0 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
296c0 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69     t = pgnoNew[i
296d0 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  ];.      pT = ap
296e0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  New[i];.      pg
296f0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e  noNew[i] = pgnoN
29700 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
29710 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
29720 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67  [minI];.      pg
29730 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b  noNew[minI] = t;
29740 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
29750 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
29760 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   }.  TRACE(("BAL
29770 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
29780 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29   %d  new: %d(%d)
29790 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
297a0 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
297b0 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c  .    pgnoOld[0],
297c0 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
297d0 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a  pgnoOld[1] : 0,.
297e0 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67      nOld>=3 ? pg
297f0 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20  noOld[2] : 0,.  
29800 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a    pgnoNew[0], sz
29810 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
29820 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d  >=2 ? pgnoNew[1]
29830 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
29840 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
29850 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f    nNew>=3 ? pgno
29860 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[2] : 0, nNew
29870 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
29880 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
29890 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30  ? pgnoNew[3] : 0
298a0 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
298b0 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
298c0 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=5 ? pgnoNew[
298d0 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  4] : 0, nNew>=5 
298e0 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
298f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
29900 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
29910 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
29920 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
29930 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
29940 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
29950 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
29960 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
29970 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
29980 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
29990 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
299a0 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
299b0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
299c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
299d0 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
299e0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
299f0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
29a00 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d  rt( pNew->pgno==
29a10 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20  pgnoNew[i] );.  
29a20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
29a30 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
29a40 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
29a50 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
29a60 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
29a70 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
29a80 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
29a90 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
29aa0 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
29ab0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29ac0 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
29ad0 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
29ae0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
29af0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
29b00 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
29b10 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
29b20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
29b30 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
29b40 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
29b50 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
29b60 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
29b70 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
29b80 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
29b90 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
29ba0 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
29bb0 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
29bc0 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
29bd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29be0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29bf0 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
29c00 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
29c10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29c20 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
29c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
29c40 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
29c50 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
29c60 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
29c70 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
29c80 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
29c90 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
29ca0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29cb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61  SQLITE_OK && lea
29cc0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
29cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29ce0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
29cf0 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
29d00 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[k]), PTRMAP_BT
29d10 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
29d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29d30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29d50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
29d60 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29d70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29d80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29d90 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e   }..    j = cntN
29da0 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
29db0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
29dc0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
29dd0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
29de0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29df0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
29e00 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
29e10 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
29e20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
29e30 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
29e40 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
29e50 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
29e60 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
29e70 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
29e80 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
29e90 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
29ea0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
29eb0 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
29ec0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
29ed0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
29ee0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32  pTemp = &aSpace2
29ef0 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20  [iSpace2];.     
29f00 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
29f10 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
29f20 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
29f30 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
29f40 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
29f50 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20 20  OVACUUM .       
29f60 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d    && (aFrom[j]==
29f70 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
29f80 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[j]]->pgno!=
29f90 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20  pNew->pgno).    
29fa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29fb0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
29fc0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
29fd0 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  ell), PTRMAP_BTR
29fe0 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  EE, pNew->pgno);
29ff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2a000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a010 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2a020 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2a030 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2a050 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
2a060 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2a070 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
2a080 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
2a090 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
2a0a0 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
2a0b0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2a0c0 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
2a0d0 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
2a0e0 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
2a0f0 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
2a100 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
2a110 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
2a120 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
2a130 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
2a140 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2a150 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
2a160 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
2a170 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
2a180 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
2a190 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
2a1a0 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
2a1b0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
2a1c0 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
2a1d0 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
2a1e0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
2a1f0 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  mp;.        fill
2a200 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
2a210 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
2a220 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73  Key, 0, 0, 0, &s
2a230 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  z);.        pTem
2a240 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
2a250 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
2a260 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
2a270 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
2a280 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
2a290 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
2a2a0 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
2a2b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
2a2c0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
2a2d0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
2a2e0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
2a2f0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
2a300 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
2a310 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
2a320 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
2a330 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
2a340 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
2a350 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2a360 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
2a370 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
2a380 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
2a390 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
2a3a0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
2a3b0 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
2a3c0 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
2a3d0 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
2a3e0 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
2a3f0 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
2a400 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2a410 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
2a420 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
2a430 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
2a440 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
2a450 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
2a460 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
2a470 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
2a480 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
2a490 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
2a4a0 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
2a4b0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
2a4c0 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
2a4d0 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
2a4e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
2a4f0 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
2a500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
2a510 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
2a520 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
2a530 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2a540 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
2a550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a560 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d        iSpace2 +=
2a570 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
2a580 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
2a590 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
2a5a0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c  assert( iSpace2<
2a5b0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
2a5c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
2a5d0 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2a5e0 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
2a5f0 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
2a600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a610 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
2a620 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2a630 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2a640 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2a650 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2a660 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 70  Page) );.      p
2a670 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
2a680 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
2a690 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
2a6a0 67 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  gno);..      /* 
2a6b0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2a6c0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2a6d0 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65  se, and not a le
2a6e0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20  af-data tree,.  
2a6f0 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61      ** then upda
2a700 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
2a710 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79  ap with an entry
2a720 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
2a730 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
2a740 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75  that the cell ju
2a750 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e  st inserted poin
2a760 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a  ts to (if any)..
2a770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2a780 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2a790 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
2a7a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2a7b0 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
2a7c0 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
2a7d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a7e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a7f0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a800 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2a810 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2a820 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69   j++;.      nxDi
2a830 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  v++;.    }..    
2a840 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  /* Set the point
2a850 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
2a860 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
2a870 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66   page. */.    if
2a880 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2a890 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2a8a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
2a8b0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
2a8c0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
2a8d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2a8e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a8f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61  .        goto ba
2a900 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2a910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a920 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
2a930 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2a940 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
2a950 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
2a960 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
2a970 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
2a980 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64  {.    u8 *zChild
2a990 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d   = &apCopy[nOld-
2a9a0 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20  1]->aData[8];.  
2a9b0 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
2a9c0 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
2a9d0 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20  ], zChild, 4);. 
2a9e0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2a9f0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UUM ){.      rc 
2aa00 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2aa10 20 67 65 74 34 62 79 74 65 28 7a 43 68 69 6c 64   get4byte(zChild
2aa20 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2aa30 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e   apNew[nNew-1]->
2aa40 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2aa50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2aa60 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62  {.        goto b
2aa70 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2aa80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2aa90 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
2aaa0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2aab0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2aac0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 6e  Page) );.  if( n
2aad0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
2aae0 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
2aaf0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
2ab00 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
2ab10 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
2ab20 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
2ab30 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
2ab40 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2ab50 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2ab60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2ab70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
2ab80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2ab90 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
2aba0 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
2abb0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
2abc0 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
2abd0 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
2abe0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
2abf0 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
2ac00 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2ac10 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2ac20 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
2ac30 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
2ac40 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2ac50 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  Balance the pare
2ac60 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74  nt page.  Note t
2ac70 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
2ac80 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67  page (pPage) mig
2ac90 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ht.  ** have bee
2aca0 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  n added to the f
2acb0 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69  reelist so it mi
2acc0 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  ght no longer be
2acd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
2ace0 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e  ** But the paren
2acf0 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61  t page will alwa
2ad00 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ys be initialize
2ad10 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
2ad20 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
2ad30 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  t );.  sqlite3Sc
2ad40 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2ad50 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b  );.  apCell = 0;
2ad60 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2ad70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Page);.  pCur->i
2ad80 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62  Page--;.  rc = b
2ad90 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
2ada0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  .  .  /*.  ** Cl
2adb0 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
2adc0 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
2add0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
2ade0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
2adf0 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69  aSpace2);.  sqli
2ae00 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
2ae10 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
2ae20 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2ae30 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2ae40 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
2ae50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
2ae60 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
2ae70 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
2ae80 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  ]);.  }.  pPage-
2ae90 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
2aea0 0a 20 20 2f 2a 20 72 65 6c 65 61 73 65 50 61 67  .  /* releasePag
2aeb0 65 28 70 50 61 72 65 6e 74 29 3b 20 2a 2f 0a 20  e(pParent); */. 
2aec0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2aed0 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20  : finished with 
2aee0 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  %d: old=%d new=%
2aef0 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
2af00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2af10 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77  pgno, nOld, nNew
2af20 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 72 65  , nCell));..  re
2af30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2af40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2af50 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
2af60 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
2af70 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72  btree when the r
2af80 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  oot.** page cont
2af90 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20  ains no cells.  
2afa0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72  This is an oppor
2afb0 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74  tunity to make t
2afc0 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c  he tree.** shall
2afd0 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65  ower by one leve
2afe0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2aff0 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2b000 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  er(BtCursor *pCu
2b010 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2b020 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2b030 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2b040 6f 66 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20 4d  of B-Tree */.  M
2b050 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
2b060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b070 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
2b080 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
2b090 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b0b0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
2b0c0 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
2b0d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2b0f0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
2b100 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
2b110 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
2b140 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
2b150 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
2b160 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
2b170 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
2b180 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
2b190 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2b1a0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2b1b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2b1c0 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
2b1d0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2b1e0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b200 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2b210 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
2b220 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2b230 67 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ge==0 );.  pPage
2b240 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2b250 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  0];..  assert( p
2b260 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2b270 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b280 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b290 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2b2a0 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  ) );.  pBt = pPa
2b2b0 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c  ge->pBt;.  mxCel
2b2c0 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45  lPerPage = MX_CE
2b2d0 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c  LL(pBt);.  apCel
2b2e0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
2b2f0 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  c( mxCellPerPage
2b300 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69  *(sizeof(u8*)+si
2b310 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20  zeof(u16)) );.  
2b320 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20  if( apCell==0 ) 
2b330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b340 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  MEM;.  szCell = 
2b350 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78  (u16*)&apCell[mx
2b360 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20  CellPerPage];.  
2b370 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2b380 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
2b390 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
2b3a0 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54  y empty */.    T
2b3b0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2b3c0 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e  empty table %d\n
2b3d0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
2b3e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2b3f0 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2b400 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
2b410 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
2b420 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a  nsfer the.    **
2b430 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2b440 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64  m that one child
2b450 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70   into the root p
2b460 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a  age if it .    *
2b470 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
2b480 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
2b490 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
2b4a0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  by one..    **. 
2b4b0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f     ** If the roo
2b4c0 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  t page is page 1
2b4d0 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70  , it has less sp
2b4e0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68  ace available th
2b4f0 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68  an.    ** its ch
2b500 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20  ild (due to the 
2b510 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20  100 byte header 
2b520 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
2b530 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
2b540 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
2b550 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
2b560 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
2b570 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
2b580 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66   the .    ** inf
2b590 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
2b5a0 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
2b5b0 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
2b5c0 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20  his is the .    
2b5d0 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
2b5e0 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
2b5f0 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
2b600 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
2b610 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2b620 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f  right-pointer to
2b630 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
2b640 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65    The child page
2b650 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20   becomes.    ** 
2b660 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2b670 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
2b680 20 20 2a 2f 0a 20 20 20 20 56 56 41 5f 4f 4e 4c    */.    VVA_ONL
2b690 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
2b6a0 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20  uffled = 1 );.  
2b6b0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2b6c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2b6d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2b6e0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
2b6f0 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2b700 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2b710 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67  ( pgnoChild<=pag
2b720 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2b730 65 2d 3e 70 42 74 29 20 29 3b 0a 20 20 20 20 72  e->pBt) );.    r
2b740 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b750 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  GetPage(pPage->p
2b760 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
2b770 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pChild, 0);.    
2b780 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2b790 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2b7a0 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
2b7b0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
2b7c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b7d0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
2b7e0 69 6c 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ild);.      if( 
2b7f0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
2b800 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2b810 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
2b820 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ild->nOverflow==
2b830 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2b840 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30  Child->nFree>=10
2b850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2b860 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d  The child inform
2b870 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f  ation will fit o
2b880 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  n the root page,
2b890 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20   so do the.     
2b8a0 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20     ** copy */.  
2b8b0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2b8c0 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50       zeroPage(pP
2b8d0 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2b8e0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[0]);.        
2b8f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
2b900 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
2b910 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c            apCell
2b920 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2b930 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20  Child,i);.      
2b940 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20      szCell[i] = 
2b950 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69  cellSizePtr(pChi
2b960 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a  ld, apCell[i]);.
2b970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b980 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2b990 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43  Page, pChild->nC
2b9a0 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43  ell, apCell, szC
2b9b0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ell);.        /*
2b9c0 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d   Copy the right-
2b9d0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2b9e0 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65  hild to the pare
2b9f0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nt. */.        a
2ba00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2ba10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ba20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2ba30 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
2ba40 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2ba50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2ba60 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  t+8], .         
2ba70 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68     get4byte(&pCh
2ba80 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c  ild->aData[pChil
2ba90 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  d->hdrOffset+8])
2baa0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2bab0 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
2bac0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2bad0 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2bae0 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20   %d transfer to 
2baf0 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
2bb00 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
2bb10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bb20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
2bb30 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
2bb40 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
2bb50 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
2bb60 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65       ** The tree
2bb70 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61   is already bala
2bb80 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e  nced.  Do nothin
2bb90 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52  g. */.        TR
2bba0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2bbb0 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74  hild %d will not
2bbc0 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e   fit on page 1\n
2bbd0 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
2bbe0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2bbf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
2bc00 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  py(pPage->aData,
2bc10 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20   pChild->aData, 
2bc20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2bc30 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  leSize);.      p
2bc40 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2bc50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2bc60 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2bc70 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2bc80 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2bc90 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
2bca0 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
2bcb0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42  .      TRACE(("B
2bcc0 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72  ALANCE: transfer
2bcd0 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72   child %d into r
2bce0 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  oot %d\n",.     
2bcf0 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d           pChild-
2bd00 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67  >pgno, pPage->pg
2bd10 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2bd20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2bd30 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23  Overflow==0 );.#
2bd40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2bd50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2bd60 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2bd70 55 4d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  UM && rc==SQLITE
2bd80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2bd90 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2bda0 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  s(pPage);.    }.
2bdb0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61  #endif.    relea
2bdc0 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2bdd0 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f    }.end_shallow_
2bde0 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74  balance:.  sqlit
2bdf0 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b  e3_free(apCell);
2be00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2be10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
2be20 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
2be30 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  l.**.** When thi
2be40 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74  s happens, Creat
2be50 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  e a new child pa
2be60 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a  ge and copy the.
2be70 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
2be80 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65  he root into the
2be90 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61   child.  Then ma
2bea0 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  ke the root.** p
2beb0 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67  age an empty pag
2bec0 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c  e with rightChil
2bed0 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  d pointing to th
2bee0 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20  e new.** child. 
2bef0 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20    Finally, call 
2bf00 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c  balance_internal
2bf10 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68  () on the new ch
2bf20 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20  ild.** to cause 
2bf30 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a  it to split..*/.
2bf40 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2bf50 63 65 5f 64 65 65 70 65 72 28 42 74 43 75 72 73  ce_deeper(BtCurs
2bf60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2bf70 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2bf80 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
2bf90 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
2bfa0 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
2bfb0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   *pPage;     /* 
2bfc0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
2bfd0 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  oot page */.  Me
2bfe0 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2bff0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c000 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2c010 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2c020 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67  hild;     /* Pag
2c030 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2c040 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2c050 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2c060 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t;         /* Th
2c070 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e BTree */.  int
2c080 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
2c090 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65   /* Total usable
2c0a0 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
2c0b0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2c0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2c0d0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ent of the paren
2c0e0 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  t page */.  u8 *
2c0f0 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  cdata;          
2c100 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2c110 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  e child page */.
2c120 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2c130 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2c140 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69  to page header i
2c150 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e  n parent */.  in
2c160 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
2c170 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2c180 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20  ontent of first 
2c190 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a  cell in parent *
2c1a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  /..  assert( pCu
2c1b0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20  r->iPage==0 );. 
2c1c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2c1d0 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66  pPage[0]->nOverf
2c1e0 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41 5f  low>0 );..  VVA_
2c1f0 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
2c200 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
2c210 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2c220 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70 42  >apPage[0];.  pB
2c230 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2c240 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c250 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2c260 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2c270 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2c280 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2c290 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2c2a0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2c2b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2c2c0 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69  pChild, &pgnoChi
2c2d0 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ld, pPage->pgno,
2c2e0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2c2f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
2c300 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2c310 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
2c320 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
2c330 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
2c340 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2c350 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2c360 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
2c370 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2c380 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
2c390 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2c3a0 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68  );.  cdata = pCh
2c3b0 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65  ild->aData;.  me
2c3c0 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74  mcpy(cdata, &dat
2c3d0 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63  a[hdr], pPage->c
2c3e0 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
2c3f0 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20  e->nCell-hdr);. 
2c400 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 63   memcpy(&cdata[c
2c410 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b  brk], &data[cbrk
2c420 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 62  ], usableSize-cb
2c430 72 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rk);..  assert( 
2c440 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d  pChild->isInit==
2c450 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2c460 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2c470 28 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20  (pChild);.  if( 
2c480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c490 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  .    int nCopy =
2c4a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c4b0 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
2c4c0 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d  aOvfl[0]);.    m
2c4d0 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
2c4e0 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
2c4f0 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70  l, nCopy);.    p
2c500 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2c510 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2c520 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 43 68  low;.    if( pCh
2c530 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
2c540 7b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  {.      pChild->
2c550 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d  nFree = 0;.    }
2c560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68  .    assert( pCh
2c570 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67  ild->nCell==pPag
2c580 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2c590 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2c5a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c5b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2c5c0 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2c5d0 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2c5e0 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
2c5f0 45 41 46 29 3b 0a 20 20 20 20 70 75 74 34 62 79  EAF);.    put4by
2c600 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2c610 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2c620 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
2c630 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  ;.    TRACE(("BA
2c640 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74  LANCE: copy root
2c650 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20   %d into %d\n", 
2c660 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68  pPage->pgno, pCh
2c670 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2c680 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2c690 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
2c6a0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2c6b0 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52  Child->pgno, PTR
2c6c0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65  MAP_BTREE, pPage
2c6d0 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66  ->pgno);.#ifndef
2c6e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c6f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
2c700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c710 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c720 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2c730 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d  pChild);.      }
2c740 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2c750 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
2c760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
2c770 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20  ur->iPage++;.   
2c780 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
2c790 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 20 20 70   = pChild;.    p
2c7a0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
2c7b0 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  0;.    rc = bala
2c7c0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72  nce_nonroot(pCur
2c7d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c7e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2c7f0 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ld);.  }..  retu
2c800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c810 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
2c820 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
2c830 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
2c840 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
2c850 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
2c860 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
2c870 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
2c880 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
2c890 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
2c8a0 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
2c8b0 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
2c8c0 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
2c8d0 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
2c8e0 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  ** routine..** .
2c8f0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 49  ** Parameter isI
2c900 6e 73 65 72 74 20 69 73 20 74 72 75 65 20 69 66  nsert is true if
2c910 20 61 20 6e 65 77 20 63 65 6c 6c 20 77 61 73 20   a new cell was 
2c920 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 69 6e  just inserted in
2c930 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20  to the.** page, 
2c940 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c950 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2c960 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73  t balance(BtCurs
2c970 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 69 73  or *pCur, int is
2c980 49 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  Insert){.  int r
2c990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c9a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2c9b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2c9c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20  Cur->iPage];..  
2c9d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c9e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2c9f0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2ca00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
2ca10 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ge==0 ){.    rc 
2ca20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ca30 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2ca40 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
2ca50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2ca60 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2ca70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2ca80 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 43  alance_deeper(pC
2ca90 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ur);.      asser
2caa0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2cab0 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51  low==0 || rc!=SQ
2cac0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
2cad0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2cae0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2caf0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
2cb00 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2cb10 73 68 61 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b  shallower(pCur);
2cb20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2cb30 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2cb40 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  =0 || rc!=SQLITE
2cb50 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  _OK );.    }.  }
2cb60 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
2cb70 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2cb80 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69   || .        (!i
2cb90 73 49 6e 73 65 72 74 20 26 26 20 70 50 61 67 65  sInsert && pPage
2cba0 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70  ->nFree>pPage->p
2cbb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2cbc0 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  /3) ){.      rc 
2cbd0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2cbe0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61  t(pCur);.      a
2cbf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2cc00 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63  verflow==0 || rc
2cc10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2cc20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2cc30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2cc40 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
2cc50 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74  ks all cursors t
2cc60 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62  hat point to tab
2cc70 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20  le pgnoRoot..** 
2cc80 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  If any of those 
2cc90 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65  cursors were ope
2cca0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
2ccb0 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  =0 in a differen
2ccc0 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
2ccd0 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61  nnection (a data
2cce0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2ccf0 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65 20  that shares the 
2cd00 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77  pager.** cache w
2cd10 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
2cd20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20  connection) and 
2cd30 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65  that other conne
2cd40 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74  ction .** is not
2cd50 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f   in the ReadUnco
2cd60 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20  mmmitted state, 
2cd70 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2cd80 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  e returns .** SQ
2cd90 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a  LITE_LOCKED..**.
2cda0 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63 75  ** As well as cu
2cdb0 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61  rsors with wrFla
2cdc0 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77 69  g==0, cursors wi
2cdd0 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61 6e 64  th wrFlag==1 and
2cde0 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48   .** isIncrblobH
2cdf0 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73  andle==1 are als
2ce00 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65  o considered 're
2ce10 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49 6e 63  ad' cursors. Inc
2ce20 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f  remental .** blo
2ce30 62 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73  b cursors are us
2ce40 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
2ce50 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
2ce60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f  .**.** When pgno
2ce70 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74  Root is the root
2ce80 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b   page of an intk
2ce90 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66  ey table, this f
2cea0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a  unction is also.
2ceb0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
2cec0 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  or invalidating 
2ced0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2cee0 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68   cursors when th
2cef0 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f  e table row.** o
2cf00 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65  n which they are
2cf10 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74   opened is delet
2cf20 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20  ed or modified. 
2cf30 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  Cursors are inva
2cf40 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72  lidated.** accor
2cf50 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ding to the foll
2cf60 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  owing rules:.**.
2cf70 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72  **   1) When Btr
2cf80 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69  eeClearTable() i
2cf90 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
2cfa0 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68  letely delete th
2cfb0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20  e contents.**   
2cfc0 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74     of a B-Tree t
2cfd0 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69  able, pExclude i
2cfe0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e  s set to zero an
2cff0 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77  d parameter iRow
2d000 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74   is .**      set
2d010 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   to non-zero. In
2d020 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69   this case all i
2d030 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2d040 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20  cursors open.** 
2d050 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c       on the tabl
2d060 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f  e rooted at pgno
2d070 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64  Root are invalid
2d080 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  ated..**.**   2)
2d090 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72   When BtreeInser
2d0a0 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65  t(), BtreeDelete
2d0b0 28 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61  () or BtreePutDa
2d0c0 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ta() is called t
2d0d0 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66  o .**      modif
2d0e0 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69  y a table row vi
2d0f0 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  a an SQL stateme
2d100 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  nt, pExclude is 
2d110 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20  set to the .**  
2d120 20 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72      write cursor
2d130 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
2d140 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64  modification and
2d150 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
2d160 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74  is set.**      t
2d170 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  o the integer ro
2d180 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72  w id of the B-Tr
2d190 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d  ee entry being m
2d1a0 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a  odified. Unless.
2d1b0 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65  **      pExclude
2d1c0 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e   is itself an in
2d1d0 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2d1e0 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20  ursor, then all 
2d1f0 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20  incremental.**  
2d200 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73      blob cursors
2d210 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f   open on row iRo
2d220 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  w of the B-Tree 
2d230 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2d240 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62  .**.**   3) If b
2d250 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64  oth pExclude and
2d260 20 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f   iRow are set to
2d270 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d   zero, no increm
2d280 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20  ental blob .**  
2d290 20 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20      cursors are 
2d2a0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
2d2b0 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2d2c0 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42 74 72  ReadLocks(.  Btr
2d2d0 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20 20 50  ee *pBtree, .  P
2d2e0 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20  gno pgnoRoot, . 
2d2f0 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c   BtCursor *pExcl
2d300 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f 77 0a  ude,.  i64 iRow.
2d310 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2d320 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2d330 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
2d340 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2d350 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61   pBtree->db;.  a
2d360 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2d370 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
2d380 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
2d390 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2d3a0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2d3b0 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75     if( p==pExclu
2d3c0 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
2d3d0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
2d3e0 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63  ot!=pgnoRoot ) c
2d3f0 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
2d400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2d410 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d  RBLOB.    if( p-
2d420 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2d430 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20 20  e && ( .        
2d440 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20 69   (!pExclude && i
2d450 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70  Row).      || (p
2d460 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78 63  Exclude && !pExc
2d470 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  lude->isIncrblob
2d480 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66  Handle && p->inf
2d490 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20  o.nKey==iRow).  
2d4a0 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65    )){.      p->e
2d4b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2d4c0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65  NVALID;.    }.#e
2d4d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
2d4e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d4f0 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
2d500 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c  .    if( p->wrFl
2d510 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53  ag==0 .#ifndef S
2d520 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2d530 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69  LOB.     || p->i
2d540 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a  sIncrblobHandle.
2d550 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
2d560 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f      sqlite3 *dbO
2d570 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65  ther = p->pBtree
2d580 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20  ->db;.      if( 
2d590 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20  dbOther==0 ||.  
2d5a0 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72 21         (dbOther!
2d5b0 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d  =db && (dbOther-
2d5c0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2d5d0 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2d5e0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
2d5f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2d600 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CKED;.      }.  
2d610 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2d630 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2d640 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2d650 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2d660 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2d670 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2d680 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2d690 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2d6a0 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2d6b0 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2d6c0 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2d6d0 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
2d6e0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
2d6f0 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
2d700 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2d710 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2d720 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2d730 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
2d740 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
2d750 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
2d760 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
2d770 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
2d780 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
2d790 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
2d7a0 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
2d7b0 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
2d7c0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2d7d0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
2d7e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2d7f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d800 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
2d810 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
2d820 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
2d830 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2d840 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2d850 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
2d860 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2d870 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2d880 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
2d890 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
2d8a0 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2d8b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d8e0 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
2d8f0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
2d900 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
2d910 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20  dBias           
2d920 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d930 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
2d940 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  an append */.){.
2d950 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d960 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77  loc;.  int szNew
2d970 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
2d980 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2d990 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2d9a0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2d9b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2d9c0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2d9d0 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2d9e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2d9f0 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
2da00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2da10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2da20 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2da30 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2da40 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2da50 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2da60 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2da70 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2da80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2da90 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2daa0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2dab0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2dac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2dad0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2dae0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2daf0 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2db00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2db10 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2db20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
2db30 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2db40 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2db50 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2db60 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2db70 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79  Root, pCur, nKey
2db80 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2db90 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
2dba0 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
2dbb0 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
2dbc0 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
2dbd0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
2dbe0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2dbf0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2dc00 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2dc10 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2dc20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2dc30 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2dc40 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2dc50 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74  e */.  sqlite3Bt
2dc60 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2dc70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20  Cur);.  if( .   
2dc80 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2dc90 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2dca0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2dcb0 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a  Root, pCur)) ||.
2dcc0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2dcd0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2dce0 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b  eMoveto(pCur, pK
2dcf0 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64  ey, nKey, append
2dd00 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29  Bias, &loc)).  )
2dd10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2dd20 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2dd30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2dd40 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2dd50 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2dd60 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
2dd70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2dd80 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
2dd90 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52  ->intKey );.  TR
2dda0 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2ddb0 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2ddc0 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2ddd0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2dde0 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2ddf0 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2de00 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2de10 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2de20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2de30 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2de40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2de50 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61  Init );.  alloca
2de60 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
2de70 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42  ;.  newCell = pB
2de80 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
2de90 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
2dea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2deb0 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
2dec0 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
2ded0 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
2dee0 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
2def0 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29  , nZero, &szNew)
2df00 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2df10 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2df20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63  assert( szNew==c
2df30 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2df40 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20  , newCell) );.  
2df50 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d  assert( szNew<=M
2df60 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2df70 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72   );.  idx = pCur
2df80 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2df90 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d  age];.  if( loc=
2dfa0 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c  =0 && CURSOR_VAL
2dfb0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2dfc0 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c   ){.    u16 szOl
2dfd0 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  d;.    assert( i
2dfe0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2dff0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e000 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2e010 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2e020 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e030 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
2e040 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
2e050 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2e060 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2e070 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e080 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
2e090 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
2e0a0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
2e0b0 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
2e0c0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
2e0d0 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
2e0e0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2e0f0 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
2e100 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2e110 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  d_insert;.    rc
2e120 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67   = dropCell(pPag
2e130 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  e, idx, szOld);.
2e140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e150 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
2e160 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2e170 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2e180 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2e190 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2e1a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e1b0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78  >leaf );.    idx
2e1c0 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
2e1d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e1e0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2e1f0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
2e200 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
2e210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2e220 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2e230 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
2e240 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2e250 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
2e260 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
2e270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e280 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
2e290 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 31 29 3b  alance(pCur, 1);
2e2a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75 73 74 20  .  }..  /* Must 
2e2b0 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66  make sure nOverf
2e2c0 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f 20  low is reset to 
2e2d0 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65  zero even if the
2e2e0 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 2a 2a 20   balance().  ** 
2e2f0 66 61 69 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c  fails.  Internal
2e300 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
2e310 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
2e320 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65  result otherwise
2e330 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2e340 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2e350 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  =0 || rc!=SQLITE
2e360 5f 4f 4b 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  _OK );.  pPage->
2e370 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
2e380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e390 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2e3a0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2e3b0 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72  .end_insert:.  r
2e3c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e3d0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  ** Delete the en
2e3e0 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72  try that the cur
2e3f0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2e400 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2e410 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2e420 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72 61  ing at a arbitra
2e430 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
2e440 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2e450 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2e460 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2e470 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2e480 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e490 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  age];.  int idx;
2e4a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2e4b0 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
2e4c0 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
2e4d0 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
2e4e0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2e4f0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2e500 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2e510 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2e520 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2e530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2e540 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2e550 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2e560 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2e570 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2e580 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2e590 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2e5a0 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a  ing a delete */.
2e5b0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2e5c0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2e5d0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2e5e0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2e5f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2e600 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2e610 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43  Only );.  if( pC
2e620 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2e630 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2e640 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2e650 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  p;.  }.  if( pCu
2e660 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e670 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2e680 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ell ){.    retur
2e690 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
2e6a0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69   /* The cursor i
2e6b0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
2e6c0 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  o anything */.  
2e6d0 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  }.  if( !pCur->w
2e6e0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
2e6f0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2e700 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70     /* Did not op
2e710 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66  en this cursor f
2e720 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2e730 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2e740 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2e750 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2e760 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  oot, pCur, pCur-
2e770 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20  >info.nKey) ){. 
2e780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e790 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2e7a0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2e7b0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2e7c0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  lock */.  }..  /
2e7d0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
2e7e0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2e7f0 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69  ition (a no-op i
2e800 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2e810 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52  not in .  ** CUR
2e820 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2e830 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20  state) and save 
2e840 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2e850 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
2e860 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  rs .  ** open on
2e870 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
2e880 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   Then call sqlit
2e890 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2e8a0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
2e8b0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77  that the entry w
2e8c0 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66  ill be deleted f
2e8d0 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
2e8e0 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f  .    (rc = resto
2e8f0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2e900 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
2e910 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2e920 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2e930 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2e940 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2e950 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e960 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2e970 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
2e980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e990 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
2e9a0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
2e9b0 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65  s page and leave
2e9c0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   pCell pointing 
2e9d0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
2e9e0 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28  . The clearCell(
2e9f0 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79  ) call frees any
2ea00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2ea10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ea20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54  the.  ** cell. T
2ea30 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69  he cell itself i
2ea40 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a  s still intact..
2ea50 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75    */.  idx = pCu
2ea60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2ea70 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d  Page];.  pCell =
2ea80 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2ea90 20 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50   idx);.  if( !pP
2eaa0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2eab0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2eac0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2ead0 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2eae0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2eaf0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2eb00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2eb10 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
2eb20 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  leaf ){.    /*. 
2eb30 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20     ** The entry 
2eb40 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2eb50 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20  delete is not a 
2eb60 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f  leaf so if we do
2eb70 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73   not.    ** do s
2eb80 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c  omething we will
2eb90 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e   leave a hole on
2eba0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67   an internal pag
2ebb0 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76  e..    ** We hav
2ebc0 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f  e to fill the ho
2ebd0 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20  le by moving in 
2ebe0 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  a cell from a le
2ebf0 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  af.  The.    ** 
2ec00 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20  next Cell after 
2ec10 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65  the one to be de
2ec20 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e 74  leted is guarant
2ec30 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64  eed to exist and
2ec40 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20  .    ** to be a 
2ec50 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75  leaf so we can u
2ec60 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
2ec70 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43    BtCursor leafC
2ec80 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ur;.    MemPage 
2ec90 2a 70 4c 65 61 66 50 61 67 65 3b 0a 0a 20 20 20  *pLeafPage;..   
2eca0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2ecb0 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e  pNext;.    int n
2ecc0 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69  otUsed;.    unsi
2ecd0 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43  gned char *tempC
2ece0 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ell = 0;.    ass
2ecf0 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74  ert( !pPage->int
2ed00 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
2ed10 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
2ed20 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
2ed30 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
2ed40 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2ed50 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
2ed60 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2ed70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ed80 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2ed90 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75  Cur.aiIdx[leafCu
2eda0 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20  r.iPage]==0 );. 
2edb0 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d       pLeafPage =
2edc0 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
2edd0 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a  leafCur.iPage];.
2ede0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2edf0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65  e3PagerWrite(pLe
2ee00 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  afPage->pDbPage)
2ee10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ee20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ee30 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43  .      int leafC
2ee40 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30  ursorInvalid = 0
2ee50 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65  ;.      u16 szNe
2ee60 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  xt;.      TRACE(
2ee70 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
2ee80 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e  %d delete intern
2ee90 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61  al from %d repla
2eea0 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  ce from leaf %d\
2eeb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75  n",.         pCu
2eec0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
2eed0 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50  ge->pgno, pLeafP
2eee0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2eef0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2ef00 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  e, idx, cellSize
2ef10 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2ef20 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  ));.      pNext 
2ef30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66  = findCell(pLeaf
2ef40 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
2ef50 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2ef60 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20  ePtr(pLeafPage, 
2ef70 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73  pNext);.      as
2ef80 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
2ef90 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b  ZE(pBt)>=szNext+
2efa0 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63  4 );.      alloc
2efb0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
2efc0 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c  );.      tempCel
2efd0 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
2efe0 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  ce;.      if( te
2eff0 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  mpCell==0 ){.   
2f000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f010 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2f020 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f040 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
2f050 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70  ll(pPage, idx, p
2f060 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
2f070 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
2f080 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
2f090 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61 74  /* The "if" stat
2f0a0 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78  ement in the nex
2f0b0 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20  t code block is 
2f0c0 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  critical.  The. 
2f0d0 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73       ** slightes
2f0e0 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20  t error in that 
2f0f0 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20  statement would 
2f100 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20  allow SQLite to 
2f110 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a  operate.      **
2f120 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20   correctly most 
2f130 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74 20  of the time but 
2f140 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61 72  produce very rar
2f150 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a  e failures.  To.
2f160 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61        ** guard a
2f170 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65  gainst this, the
2f180 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
2f190 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79  s help to verify
2f1a0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
2f1b0 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e  he "if" statemen
2f1c0 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64  t is well tested
2f1d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2f1e0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2f1f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
2f200 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70  & pPage->nFree<p
2f210 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2f220 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  /3 .            
2f230 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
2f240 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
2f250 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
2f260 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
2f270 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2f280 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
2f290 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d  & pPage->nFree==
2f2a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2f2b0 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
2f2c0 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
2f2d0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2f2e0 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
2f2f0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
2f300 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2f310 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2f320 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
2f330 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2f340 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20  *2/3+1 .        
2f350 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
2f360 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
2f370 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
2f380 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
2f390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2f3a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2f3b0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
2f3c0 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e<=pBt->usableSi
2f3d0 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20  ze*2/3.         
2f3e0 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
2f3f0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
2f400 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
2f410 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
2f420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
2f430 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2f440 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72  0 || (pPage->nFr
2f450 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee > pBt->usable
2f460 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20  Size*2/3)).     
2f470 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2f480 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
2f490 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d  2+szNext == pBt-
2f4a0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
2f4b0 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28  );...      if( (
2f4c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2f4d0 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
2f4e0 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
2f4f0 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20  eSize*2/3)) &&. 
2f500 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66 50           (pLeafP
2f510 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
2f520 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
2f530 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20  eSize*2/3).     
2f540 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2f550 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2f560 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72  ken if the inter
2f570 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20  nal node is now 
2f580 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69  either overflowi
2f590 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  ng.        ** or
2f5a0 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74   underfull and t
2f5b0 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c  he leaf node wil
2f5c0 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61  l be underfull a
2f5d0 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63 65  fter the just ce
2f5e0 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ll .        ** c
2f5f0 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74  opied to the int
2f600 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65  ernal node is de
2f610 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54  leted from it. T
2f620 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c  his is a special
2f630 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
2f640 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2f650 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74  l to balance() t
2f660 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e  o correct the in
2f670 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20  ternal node.    
2f680 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67      ** may chang
2f690 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75 63  e the tree struc
2f6a0 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  ture and invalid
2f6b0 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
2f6c0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
2f6d0 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  he leafCur.apPag
2f6e0 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e  e[] and leafCur.
2f6f0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20  aiIdx[] arrays, 
2f700 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20  which will be.  
2f710 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79        ** used by
2f720 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
2f730 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65  equired to corre
2f740 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c  ct the underfull
2f750 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a   leaf.        **
2f760 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a   node..        *
2f770 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
2f780 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e   formula used in
2f790 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2f7a0 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64 20  above are based 
2f7b0 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20  on facets of.   
2f7c0 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69       ** the SQLi
2f7d0 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74  te file-format t
2f7e0 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  hat do not chang
2f7f0 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20  e over time..   
2f800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f810 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
2f820 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61  >nFree==pBt->usa
2f830 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b  bleSize*2/3+1 );
2f840 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2f850 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46  e( pLeafPage->nF
2f860 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42  ree+2+szNext==pB
2f870 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2f880 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c  3+1 );.        l
2f890 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64  eafCursorInvalid
2f8a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20   = 1;.      }   
2f8b0 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28       ..      if(
2f8c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f8d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2f8e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2f8f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2f900 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2f910 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2f920 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2f930 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f  Page, idx), pgno
2f940 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
2f950 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
2f960 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
2f970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2f980 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
2f990 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
2f9a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f9b0 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73  E_OK && leafCurs
2f9c0 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20  orInvalid ){.   
2f9d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66       /* The leaf
2f9e0 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64  -node is now und
2f9f0 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68  erfull and so th
2fa00 65 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  e tree needs to 
2fa10 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  be .        ** r
2fa20 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76  ebalanced. Howev
2fa30 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28  er, the balance(
2fa40 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  ) operation on t
2fa50 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20  he internal.    
2fa60 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76      ** node abov
2fa70 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66  e may have modif
2fa80 69 65 64 20 74 68 65 20 73 74 72 75 63 74 75 72  ied the structur
2fa90 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  e of the B-Tree 
2faa0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
2fab0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  o the current co
2fac0 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75  ntents of leafCu
2fad0 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c  r.apPage[] and l
2fae0 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20  eafCur.aiIdx[]. 
2faf0 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f         ** may no
2fb00 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20  t be trusted..  
2fb10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2fb20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   ** It is not po
2fb30 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74  ssible to copy t
2fb40 68 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d  he ancestry from
2fb50 20 70 43 75 72 2c 20 61 73 20 74 68 65 20 73 61   pCur, as the sa
2fb60 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  me.        ** ba
2fb70 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73  lance() call has
2fb80 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65   invalidated the
2fb90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20   pCur->apPage[] 
2fba0 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20  and aiIdx[].    
2fbb0 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a      ** arrays. .
2fbc0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fbd0 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74     ** The call t
2fbe0 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  o saveCursorPosi
2fbf0 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74  tion() below int
2fc00 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68  ernally saves th
2fc10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  e .        ** ke
2fc20 79 20 74 68 61 74 20 6c 65 61 66 43 75 72 20 69  y that leafCur i
2fc30 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2fc40 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74  ting to. Current
2fc50 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20  ly, there.      
2fc60 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70    ** are two cop
2fc70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20  ies of that key 
2fc80 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e  in the tree - on
2fc90 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65  e here on the le
2fca0 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  af.        ** pa
2fcb0 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f  ge and one on so
2fcc0 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  me internal node
2fcd0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68   in the tree. Th
2fce0 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20  e copy on.      
2fcf0 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f    ** the leaf no
2fd00 64 65 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  de is always the
2fd10 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65   next key in tre
2fd20 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74 68  e-order after th
2fd30 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  e .        ** co
2fd40 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  py on the intern
2fd50 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65  al node. So, the
2fd60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2fd70 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20  BtreeNext().    
2fd80 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73      ** calls res
2fd90 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2fda0 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68  on() to point th
2fdb0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2fdc0 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  copy.        ** 
2fdd0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e  stored on the in
2fde0 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65  ternal node, the
2fdf0 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68  n advances to th
2fe00 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20  e next entry,.  
2fe10 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68        ** which h
2fe20 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
2fe30 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79   copy of the key
2fe40 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
2fe50 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a   node..        *
2fe60 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65  * Net effect: le
2fe70 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e  afCur is pointin
2fe80 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75  g back to the du
2fe90 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20  plicate cell.   
2fea0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65       ** that nee
2feb0 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ds to be removed
2fec0 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75  , and the leafCu
2fed0 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20  r.apPage[] and. 
2fee0 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75         ** leafCu
2fef0 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  r.aiIdx[] arrays
2ff00 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20   are correct..  
2ff10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ff20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20   VVA_ONLY( Pgno 
2ff30 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66  leafPgno = pLeaf
2ff40 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
2ff50 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
2ff60 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c  ursorPosition(&l
2ff70 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20  eafCur);.       
2ff80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ff90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ffa0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ffb0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2ffc0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20  &notUsed);.     
2ffd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65     }.        pLe
2ffe0 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72  afPage = leafCur
2fff0 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e  .apPage[leafCur.
30000 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20  iPage];.        
30010 61 73 73 65 72 74 28 20 70 4c 65 61 66 50 61 67  assert( pLeafPag
30020 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e  e->pgno==leafPgn
30030 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  o );.        ass
30040 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49  ert( leafCur.aiI
30050 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  dx[leafCur.iPage
30060 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ]==0 );.      }.
30070 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
30080 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20  E_OK==rc.       
30090 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
300a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
300b0 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d  Write(pLeafPage-
300c0 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20 20 20  >pDbPage)) .    
300d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f    ){.        dro
300e0 70 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c  pCell(pLeafPage,
300f0 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20   0, szNext);.   
30100 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c       VVA_ONLY( l
30110 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75 66  eafCur.pagesShuf
30120 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20  fled = 0 );.    
30130 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
30140 28 26 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a 20  (&leafCur, 0);. 
30150 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
30160 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64  eafCursorInvalid
30170 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61 67   || !leafCur.pag
30180 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20 20  esShuffled.     
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
301b0 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75   !pCur->pagesShu
301c0 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ffled );.      }
301d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
301e0 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
301f0 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75  mpCursor(&leafCu
30200 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
30210 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
30220 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
30230 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
30240 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ,.       pCur->p
30250 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
30260 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d  pgno));.    rc =
30270 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
30280 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
30290 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
302a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
302b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
302c0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
302d0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ur, 0);.    }.  
302e0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
302f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
30300 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
30310 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30320 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
30330 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
30340 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
30350 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
30360 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
30370 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
30380 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
30390 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
303a0 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
303b0 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
303c0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
303d0 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
303e0 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
303f0 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
30400 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
30410 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
30420 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
30430 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
30440 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
30450 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
30460 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
30470 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
30480 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
30490 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
304a0 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
304b0 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
304c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
304d0 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
304e0 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
304f0 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
30500 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
30510 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
30520 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
30530 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
30540 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
30550 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
30560 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
30570 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
30580 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
30590 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
305a0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
305b0 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a  nsaction first *
305c0 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
305d0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
305e0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
305f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
30600 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
30610 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
30620 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
30630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30640 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
30650 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
30660 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
30670 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
30680 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
30690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
306a0 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
306b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
306c0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
306d0 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
306e0 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
306f0 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
30700 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
30710 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
30720 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
30730 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
30740 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67  .    /* Creating
30750 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79   a new table may
30760 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72   probably requir
30770 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73  e moving an exis
30780 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20  ting database.  
30790 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f    ** to make roo
307a0 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  m for the new ta
307b0 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20  bles root page. 
307c0 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67  In case this pag
307d0 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f  e turns.    ** o
307e0 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72  ut to be an over
307f0 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74  flow page, delet
30800 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  e all overflow p
30810 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20  age-map caches. 
30820 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70     ** held by op
30830 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20  en cursors..    
30840 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  */.    invalidat
30850 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
30860 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  e(pBt);..    /* 
30870 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
30880 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
30890 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
308a0 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
308b0 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
308c0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
308d0 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
308e0 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
308f0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
30900 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
30910 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
30920 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
30930 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
30940 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
30950 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
30960 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74  (p, 4, &pgnoRoot
30970 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
309a0 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b   }.    pgnoRoot+
309b0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
309c0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
309d0 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
309e0 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
309f0 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
30a00 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
30a10 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
30a20 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f  .    while( pgno
30a30 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Root==PTRMAP_PAG
30a40 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  ENO(pBt, pgnoRoo
30a50 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67  t) ||.        pg
30a60 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f  noRoot==PENDING_
30a70 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30a80 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74  {.      pgnoRoot
30a90 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
30aa0 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d  sert( pgnoRoot>=
30ab0 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  3 );..    /* All
30ac0 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68  ocate a page. Th
30ad0 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72  e page that curr
30ae0 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74  ently resides at
30af0 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20   pgnoRoot will. 
30b00 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74     ** be moved t
30b10 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
30b20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65  page (unless the
30b30 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
30b40 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74  happens.    ** t
30b50 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f  o reside at pgno
30b60 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Root)..    */.  
30b70 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
30b80 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
30b90 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d  PageMove, &pgnoM
30ba0 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31  ove, pgnoRoot, 1
30bb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30be0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   }..    if( pgno
30bf0 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Move!=pgnoRoot )
30c00 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52  {.      /* pgnoR
30c10 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20  oot is the page 
30c20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
30c30 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
30c40 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  age of.      ** 
30c50 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61  the new table (a
30c60 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72  ssuming an error
30c70 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e   did not occur).
30c80 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20   But we were.   
30c90 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
30ca0 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71  pgnoMove. If req
30cb0 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69  uired (i.e. if i
30cc0 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  t was not alloca
30cd0 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  ted.      ** by 
30ce0 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69  extending the fi
30cf0 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74  le), the current
30d00 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f   page at positio
30d10 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20  n pgnoMove.     
30d20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a   ** is already j
30d30 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20  ournaled..      
30d40 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  */.      u8 eTyp
30d50 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50  e;.      Pgno iP
30d60 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72  trPage;..      r
30d70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30d80 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Move);..      /*
30d90 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63   Move the page c
30da0 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f  urrently at pgno
30db0 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65  Root to pgnoMove
30dc0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
30dd0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
30de0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
30df0 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
30e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30e30 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
30e40 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70  ptrmapGet(pBt, p
30e50 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c  gnoRoot, &eType,
30e60 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
30e70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30e80 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50  E_OK || eType==P
30e90 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c  TRMAP_ROOTPAGE |
30ea0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
30eb0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
30ec0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30ed0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
30ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30ef0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
30f00 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
30f10 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20  OOTPAGE );.     
30f20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
30f30 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
30f40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
30f50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30f60 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
30f70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30f90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30fa0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
30fb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30fc0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65   }.      rc = re
30fd0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
30fe0 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50  pRoot, eType, iP
30ff0 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65  trPage, pgnoMove
31000 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  , 0);.      rele
31010 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
31020 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
31030 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e   the page at pgn
31040 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69  oRoot */.      i
31050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31060 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
31070 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
31080 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31090 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
310a0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
310b0 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
310c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
310d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
310e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
310f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31100 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
31110 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
31120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31140 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
31150 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
31160 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
31170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31180 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76  pRoot = pPageMov
31190 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f  e;.    } ..    /
311a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69  * Update the poi
311b0 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74  nter-map and met
311c0 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20  a-data with the 
311d0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  new root-page nu
311e0 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20  mber. */.    rc 
311f0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
31200 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41   pgnoRoot, PTRMA
31210 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a  P_ROOTPAGE, 0);.
31220 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31230 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31240 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65  pRoot);.      re
31250 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
31260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
31270 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
31280 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a  , 4, pgnoRoot);.
31290 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
312a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
312b0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65  pRoot);.      re
312c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
312d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
312e0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
312f0 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
31300 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
31310 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
31330 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
31340 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
31350 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70  iteable(pRoot->p
31360 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72  DbPage) );.  zer
31370 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61  oPage(pRoot, fla
31380 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  gs | PTF_LEAF);.
31390 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
313a0 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ref(pRoot->pDbPa
313b0 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20  ge);.  *piTable 
313c0 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b  = (int)pgnoRoot;
313d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
313e0 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
313f0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
31400 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
31410 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
31420 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
31430 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
31440 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
31450 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
31460 20 72 63 20 3d 20 62 74 72 65 65 43 72 65 61 74   rc = btreeCreat
31470 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c  eTable(p, piTabl
31480 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c  e, flags);.  sql
31490 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
314a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
314b0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74  }../*.** Erase t
314c0 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
314d0 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69  e page and all i
314e0 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65  ts children.  Re
314f0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  turn.** the page
31500 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
31510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31520 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
31530 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
31540 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
31550 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20   The BTree that 
31560 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62  contains the tab
31570 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
31580 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o,            /*
31590 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
315a0 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66  clear */.  int f
315b0 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20 20 20  reePageFlag,    
315c0 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70   /* Deallocate p
315d0 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  age if true */. 
315e0 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29   int *pnChange.)
315f0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
31600 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
31610 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
31620 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  r *pCell;.  int 
31630 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
31640 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31650 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
31660 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72    if( pgno>pager
31670 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
31680 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31690 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
316a0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65  ;.  }..  rc = ge
316b0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
316c0 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  , pgno, &pPage);
316d0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
316e0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
316f0 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d  ge_out;.  for(i=
31700 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
31710 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65  l; i++){.    pCe
31720 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
31730 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
31740 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31750 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61  .      rc = clea
31760 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
31770 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
31780 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29  l), 1, pnChange)
31790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
317a0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
317b0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  asepage_out;.   
317c0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61   }.    rc = clea
317d0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
317e0 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
317f0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
31800 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
31810 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
31820 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
31830 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
31840 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
31850 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38  (&pPage->aData[8
31860 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29  ]), 1, pnChange)
31870 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
31880 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
31890 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c  epage_out;.  }el
318a0 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65 20  se if( pnChange 
318b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
318c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
318d0 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d      *pnChange +=
318e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
318f0 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
31900 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
31910 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
31920 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
31930 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31940 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31950 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20  bPage))==0 ){.  
31960 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
31970 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
31980 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ] | PTF_LEAF);. 
31990 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73   }..cleardatabas
319a0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c  epage_out:.  rel
319b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
319c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
319d0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
319e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  l information fr
319f0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  om a single tabl
31a00 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
31a10 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a  e.  iTable is.**
31a20 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
31a30 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   of the root of 
31a40 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65  the table.  Afte
31a50 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
31a60 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72  eturns,.** the r
31a70 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
31a80 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69  y, but still exi
31a90 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sts..**.** This 
31aa0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
31ab0 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
31ac0 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
31ad0 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65  e any open.** re
31ae0 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
31af0 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77  e table.  Open w
31b00 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
31b10 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
31b20 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
31b30 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43  le..**.** If pnC
31b40 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  hange is not NUL
31b50 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 69 54  L, then table iT
31b60 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6e 20  able must be an 
31b70 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 54 68  intkey table. Th
31b80 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c  e.** integer val
31b90 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ue pointed to by
31ba0 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69 6e 63   pnChange is inc
31bb0 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  remented by the 
31bc0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74  number of.** ent
31bd0 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ries in the tabl
31be0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
31bf0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
31c00 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
31c10 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68  Table, int *pnCh
31c20 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ange){.  int rc;
31c30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31c40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
31c50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
31c60 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
31c70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69  ->db;.  if( p->i
31c80 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
31c90 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
31ca0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
31cb0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
31cc0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
31cd0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
31ce0 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  = checkReadLocks
31cf0 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31  (p, iTable, 0, 1
31d00 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
31d10 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
31d20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
31d30 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
31d40 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
31d50 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
31d60 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  , 0)) ){.    /* 
31d70 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
31d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
31d90 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
31da0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
31db0 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61  iTable, 0, pnCha
31dc0 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nge);.  }.  sqli
31dd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
31de0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31df0 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
31e00 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
31e10 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64   a table and add
31e20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
31e30 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65   table to.** the
31e40 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65   freelist.  Exce
31e50 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  pt, the root of 
31e60 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61  the principle ta
31e70 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a  ble (the one on.
31e80 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65  ** page 1) is ne
31e90 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65  ver added to the
31ea0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
31eb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
31ec0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
31ed0 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
31ee0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
31ef0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  .** cursors on t
31f00 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
31f10 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
31f20 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65   enabled and the
31f30 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20   page at iTable 
31f40 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
31f50 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ** root page in 
31f60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31f70 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  e, then the last
31f80 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69   root page .** i
31f90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31fa0 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  ile is moved int
31fb0 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65  o the slot forme
31fc0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a  rly occupied by.
31fd0 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68  ** iTable and th
31fe0 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72  at last slot for
31ff0 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
32000 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  y the last root 
32010 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64  page.** is added
32020 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
32030 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62   instead of iTab
32040 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79  le.  In this say
32050 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  , all.** root pa
32060 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20  ges are kept at 
32070 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
32080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32090 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  le, which.** is 
320a0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55  necessary for AU
320b0 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b  TOVACUUM to work
320c0 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65   right.  *piMove
320d0 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
320e0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
320f0 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20  that used to be 
32100 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
32110 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62  ge in the file b
32120 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76  efore.** the mov
32130 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67  e.  If no page g
32140 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f  ets moved, *piMo
32150 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ved is set to 0.
32160 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f  .** The last roo
32170 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64  t page is record
32180 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e  ed in meta[3] an
32190 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
321a0 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64  * meta[3] is upd
321b0 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  ated by this pro
321c0 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  cedure..*/.stati
321d0 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54  c int btreeDropT
321e0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50  able(Btree *p, P
321f0 67 6e 6f 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  gno iTable, int 
32200 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  *piMoved){.  int
32210 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
32220 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53  pPage = 0;.  BtS
32230 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32240 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
32250 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
32260 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
32270 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
32280 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
32290 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
322a0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
322b0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
322c0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
322d0 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
322e0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
322f0 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
32300 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
32310 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
32320 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
32330 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
32340 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
32350 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
32360 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
32370 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
32380 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
32390 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
323a0 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
323b0 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
323c0 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
323d0 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
323e0 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
323f0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
32400 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
32410 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
32420 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
32430 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
32440 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
32450 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  le, &pPage, 0);.
32460 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32470 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
32480 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
32490 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  ble(p, iTable, 0
324a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
324b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
324c0 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
324d0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69  n rc;.  }..  *pi
324e0 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Moved = 0;..  if
324f0 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69  ( iTable>1 ){.#i
32500 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
32510 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32520 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
32530 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  age);.    releas
32540 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65  ePage(pPage);.#e
32550 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d  lse.    if( pBt-
32560 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
32570 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f       Pgno maxRoo
32580 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  tPgno;.      rc 
32590 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
325a0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78  tMeta(p, 4, &max
325b0 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20  RootPgno);.     
325c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
325d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
325e0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
325f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
32600 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
32610 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d      if( iTable==
32620 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20  maxRootPgno ){. 
32630 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
32640 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
32650 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c  pped is the tabl
32660 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
32670 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
32680 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
32690 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
326a0 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  put the root pag
326b0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  e on the free li
326c0 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  st. .        */.
326d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
326e0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
326f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32700 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
32710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32740 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
32750 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
32760 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
32770 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68  opped does not h
32780 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  ave the largest 
32790 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
327a0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
327b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20  he database. So 
327c0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68  move the page th
327d0 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65  at does into the
327e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70   .        ** gap
327f0 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
32800 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a  eted root-page..
32810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32820 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76     MemPage *pMov
32830 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  e;.        relea
32840 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32850 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32860 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
32870 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
32880 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
32890 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
328a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
328b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
328c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
328d0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
328e0 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20  age(pBt, pMove, 
328f0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
32900 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a   0, iTable, 0);.
32910 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32920 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
32930 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32970 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
32980 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
32990 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
329a0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
329b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
329c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
329d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
329e0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
329f0 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  freePage(pMove);
32a00 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
32a10 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
32a20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32a40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32a60 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52   *piMoved = maxR
32a70 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ootPgno;.      }
32a80 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
32a90 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74  he new 'max-root
32aa0 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20  -page' value in 
32ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
32ac0 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20  der. This.      
32ad0 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61  ** is the old va
32ae0 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65  lue less one, le
32af0 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74  ss one more if t
32b00 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20  hat happens to. 
32b10 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f       ** be a roo
32b20 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c  t-page number, l
32b30 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66  ess one again if
32b40 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20   that is the.   
32b50 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
32b60 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a  TE_PAGE..      *
32b70 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50  /.      maxRootP
32b80 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  gno--;.      if(
32b90 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45   maxRootPgno==PE
32ba0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
32bb0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
32bc0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
32bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
32be0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54   maxRootPgno==PT
32bf0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
32c00 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b   maxRootPgno) ){
32c10 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
32c20 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
32c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61        assert( ma
32c40 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49  xRootPgno!=PENDI
32c50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32c60 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) );..      rc =
32c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
32c80 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61  ateMeta(p, 4, ma
32c90 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
32ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
32cb0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
32cc0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
32cd0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
32ce0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
32cf0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c  e{.    /* If sql
32d00 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
32d10 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e  le was called on
32d20 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20   page 1. */.    
32d30 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
32d40 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
32d50 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  EAF );.    relea
32d60 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
32d80 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   .}.int sqlite3B
32d90 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
32da0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
32db0 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64  le, int *piMoved
32dc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
32dd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
32de0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
32df0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
32e00 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65  = btreeDropTable
32e10 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f  (p, iTable, piMo
32e20 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ved);.  sqlite3B
32e30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32e40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
32e50 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65  *.** Read the me
32e60 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ta-information o
32e70 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ut of a database
32e80 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a   file.  Meta[0].
32e90 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
32ea0 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63   of free pages c
32eb0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
32ec0 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
32ed0 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65  1].** through me
32ee0 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c  ta[15] are avail
32ef0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20  able for use by 
32f00 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20  higher layers.  
32f10 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65  Meta[0].** is re
32f20 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68  ad-only, the oth
32f30 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  ers are read/wri
32f40 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73  te..** .** The s
32f50 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62  chema layer numb
32f60 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20  ers meta values 
32f70 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74  differently.  At
32f80 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c   the schema.** l
32f90 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65  ayer (and the Se
32fa0 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64  tCookie and Read
32fb0 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20  Cookie opcodes) 
32fc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
32fd0 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e   free pages is n
32fe0 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20  ot visible.  So 
32ff0 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65  Cookie[0] is the
33000 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d   same as Meta[1]
33010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33020 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72  BtreeGetMeta(Btr
33030 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
33040 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44  u32 *pMeta){.  D
33050 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
33060 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
33070 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
33080 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33090 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
330a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
330b0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
330c0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ->db;..  /* Read
330d0 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
330e0 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
330f0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
33100 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
33110 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
33120 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
33130 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
33140 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
33150 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
33160 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
33170 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
33180 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
33190 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
331a0 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
331b0 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
331c0 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54  l case by queryT
331d0 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c  ableLock() and l
331e0 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a  ockTable())..  *
331f0 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61  /.  rc = queryTa
33200 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
33210 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
33220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33230 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
33240 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
33250 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
33260 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
33270 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
33280 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
33290 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d  ){.    /* The b-
332a0 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
332b0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
332c0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66  nce to page 1 of
332d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
332e0 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68    ** file. In th
332f0 69 73 20 63 61 73 65 20 74 68 65 20 72 65 71 75  is case the requ
33300 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20 76  ired meta-data v
33310 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61 64  alue can be read
33320 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a 2a   directly.    **
33330 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 64   from the page d
33340 61 74 61 20 6f 66 20 74 68 69 73 20 72 65 66 65  ata of this refe
33350 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20 73  rence. This is s
33360 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
33370 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75 65  han.    ** reque
33380 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66 65  sting a new refe
33390 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20 70  rence from the p
333a0 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20  ager layer..    
333b0 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e  */.    pP1 = (un
333c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 42  signed char *)pB
333d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
333e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
333f0 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f 65  * The b-tree doe
33400 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 66  s not have a ref
33410 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
33420 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33430 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f 62   file..    ** Ob
33440 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74 68  tain one from th
33450 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20  e pager layer.. 
33460 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
33470 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
33480 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26  Bt->pPager, 1, &
33490 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
334a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ( rc ){.      sq
334b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
334c0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
334d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
334e0 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
334f0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
33500 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
33510 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74 61  e);.  }.  *pMeta
33520 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
33530 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a  [36 + idx*4]);..
33540 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74 72    /* If the b-tr
33550 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  ee is not holdin
33560 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
33570 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f 6e   page 1, then on
33580 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71 75  e was .  ** requ
33590 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ested from the p
335a0 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74 68  ager layer in th
335b0 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 52  e above block. R
335c0 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
335d0 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   */.  if( !pBt->
335e0 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73 71  pPage1 ){.    sq
335f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
33600 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  pDbPage);.  }.. 
33610 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75   /* If autovacuu
33620 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20  med is disabled 
33630 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75  in this build bu
33640 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
33650 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20  to .  ** access 
33660 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  an autovacuumed 
33670 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d  database, then m
33680 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ake the database
33690 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f   readonly. .  */
336a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
336b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
336c0 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a   if( idx==4 && *
336d0 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72  pMeta>0 ) pBt->r
336e0 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e  eadOnly = 1;.#en
336f0 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  dif..  /* Grab t
33700 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  he read-lock on 
33710 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20  page 1. */.  rc 
33720 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31  = lockTable(p, 1
33730 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
33740 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
33750 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
33760 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
33770 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
33780 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  on back into the
33790 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
337a0 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f  [0] is.** read-o
337b0 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20  nly and may not 
337c0 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69  be written..*/.i
337d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55  nt sqlite3BtreeU
337e0 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20  pdateMeta(Btree 
337f0 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
33800 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61   iMeta){.  BtSha
33810 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
33820 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
33830 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72  ar *pP1;.  int r
33840 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  c;.  assert( idx
33850 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=1 && idx<=15 )
33860 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
33870 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
33880 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
33890 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
338a0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
338b0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
338c0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
338d0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
338e0 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
338f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
33900 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20  >pPage1!=0 );.  
33910 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
33920 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
33930 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33940 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
33950 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
33960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33970 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74  _OK ){.      put
33980 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
33990 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a  idx*4], iMeta);.
339a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
339b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
339c0 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20       if( idx==7 
339d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
339e0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
339f0 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29  um || iMeta==0 )
33a00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
33a10 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d  ( iMeta==0 || iM
33a20 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  eta==1 );.      
33a30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
33a40 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20 20  m = iMeta;.     
33a50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
33a60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
33a70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
33a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33a90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61  * Return the fla
33aa0 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65  g byte at the be
33ab0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
33ac0 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72  age that the cur
33ad0 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  sor.** is curren
33ae0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  tly pointing to.
33af0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33b00 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73  treeFlags(BtCurs
33b10 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
33b20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74  TODO: What about
33b30 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
33b40 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61  EEK state? Proba
33b50 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  bly need to call
33b60 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75 72  .  ** restoreCur
33b70 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65  sorPosition() he
33b80 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61  re..  */.  MemPa
33b90 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65 73  ge *pPage;.  res
33ba0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
33bb0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  on(pCur);.  pPag
33bc0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
33bd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
33be0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
33bf0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
33c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33c10 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70  ge->pBt==pCur->p
33c20 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Bt );.  return p
33c30 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44  Page ? pPage->aD
33c40 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
33c50 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f  fset] : 0;.}.../
33c60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33c70 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
33c80 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20   with a BTree.  
33c90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
33ca0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
33cb0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
33cc0 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72  g only..*/.Pager
33cd0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
33ce0 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ger(Btree *p){. 
33cf0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
33d00 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64  pPager;.}..#ifnd
33d10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
33d20 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
33d30 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65  *.** Append a me
33d40 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72  ssage to the err
33d50 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
33d60 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
33d70 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67  d checkAppendMsg
33d80 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
33d90 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20  *pCheck,.  char 
33da0 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zMsg1,.  const 
33db0 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20  char *zFormat,. 
33dc0 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73   ....){.  va_lis
33dd0 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68  t ap;.  if( !pCh
33de0 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74  eck->mxErr ) ret
33df0 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d  urn;.  pCheck->m
33e00 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b  xErr--;.  pCheck
33e10 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73  ->nErr++;.  va_s
33e20 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
33e30 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
33e40 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b  >errMsg.nChar ){
33e50 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
33e60 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65  ccumAppend(&pChe
33e70 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22  ck->errMsg, "\n"
33e80 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
33e90 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c  zMsg1 ){.    sql
33ea0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
33eb0 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  nd(&pCheck->errM
33ec0 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a  sg, zMsg1, -1);.
33ed0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50    }.  sqlite3VXP
33ee0 72 69 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65  rintf(&pCheck->e
33ef0 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61  rrMsg, 1, zForma
33f00 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
33f10 28 61 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65  (ap);.  if( pChe
33f20 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f  ck->errMsg.mallo
33f30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
33f40 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Check->mallocFai
33f50 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23  led = 1;.  }.}.#
33f60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
33f70 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
33f80 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
33f90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
33fa0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
33fb0 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20  ** Add 1 to the 
33fc0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33fd0 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20  for page iPage. 
33fe0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
33ff0 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65  second.** refere
34000 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c  nce to the page,
34010 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   add an error me
34020 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d  ssage to pCheck-
34030 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74  >zErrMsg..** Ret
34040 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61  urn 1 if there a
34050 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65  re 2 ore more re
34060 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
34070 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a  page and 0 if.**
34080 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
34090 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20  first reference 
340a0 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  to the page..**.
340b0 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  ** Also check th
340c0 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
340d0 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e  er is in bounds.
340e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
340f0 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74  heckRef(Integrit
34100 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 50 67 6e  yCk *pCheck, Pgn
34110 6f 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a  o iPage, char *z
34120 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20  Context){.  if( 
34130 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
34140 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65  n 1;.  if( iPage
34150 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 29  >pCheck->nPage )
34160 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
34170 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
34180 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20  ntext, "invalid 
34190 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
341a0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
341b0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
341c0 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69   pCheck->anRef[i
341d0 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20  Page]==1 ){.    
341e0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
341f0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
34200 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20   "2nd reference 
34210 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  to page %d", iPa
34220 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
34230 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
34240 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b   (pCheck->anRef[
34250 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a  iPage]++)>1;.}..
34260 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34270 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
34280 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
34290 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
342a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72   pointer-map for
342b0 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70   page iChild map
342c0 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50  s to .** page iP
342d0 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74  arent, pointer t
342e0 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20  ype ptrType. If 
342f0 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  not, append an e
34300 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
34310 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  to pCheck..*/.st
34320 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
34330 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69  trmap(.  Integri
34340 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20  tyCk *pCheck,   
34350 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
34360 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ck context */.  
34370 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
34380 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
34390 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
343a0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
343b0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
343c0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
343d0 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  type */.  Pgno i
343e0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
343f0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
34400 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20  nter map parent 
34410 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
34420 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
34430 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
34440 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28  xt description (
34450 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
34460 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sg) */.){.  int 
34470 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70  rc;.  u8 ePtrmap
34480 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Type;.  Pgno iPt
34490 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72  rmapParent;..  r
344a0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43  c = ptrmapGet(pC
344b0 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c  heck->pBt, iChil
344c0 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c  d, &ePtrmapType,
344d0 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29   &iPtrmapParent)
344e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
344f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
34500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34510 4d 20 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c  M ) pCheck->mall
34520 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
34530 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34540 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
34550 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65  t, "Failed to re
34560 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64  ad ptrmap key=%d
34570 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ", iChild);.    
34580 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
34590 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d  f( ePtrmapType!=
345a0 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70  eType || iPtrmap
345b0 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20  Parent!=iParent 
345c0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
345d0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
345e0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22  ontext, .      "
345f0 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72  Bad ptr map entr
34600 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65  y key=%d expecte
34610 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25  d=(%d,%d) got=(%
34620 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69  d,%d)", .      i
34630 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50  Child, eType, iP
34640 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79  arent, ePtrmapTy
34650 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e  pe, iPtrmapParen
34660 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
34670 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
34680 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
34690 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f  he freelist or o
346a0 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
346b0 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69  ge list..** Veri
346c0 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
346d0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
346e0 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f  he list is N..*/
346f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
34700 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72  ckList(.  Integr
34710 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
34720 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
34730 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  cking context */
34740 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73  .  int isFreeLis
34750 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t,       /* True
34760 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e   for a freelist.
34770 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72    False for over
34780 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a  flow page list *
34790 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
347a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
347b0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  e number for fir
347c0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  st page in the l
347d0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ist */.  int N, 
347e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
347f0 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
34800 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
34810 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  e list */.  char
34820 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
34830 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
34840 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
34850 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
34860 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20   int expected = 
34870 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  N;.  int iFirst 
34880 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65  = iPage;.  while
34890 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68  ( N-- > 0 && pCh
348a0 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20  eck->mxErr ){.  
348b0 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50    DbPage *pOvflP
348c0 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  age;.    unsigne
348d0 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74  d char *pOvflDat
348e0 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  a;.    if( iPage
348f0 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  <1 ){.      chec
34900 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
34910 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
34920 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20        "%d of %d 
34930 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72  pages missing fr
34940 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  om overflow list
34950 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22   starting at %d"
34960 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c  ,.          N+1,
34970 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73   expected, iFirs
34980 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
34990 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
349a0 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
349b0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
349c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
349d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
349e0 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72  t(pCheck->pPager
349f0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
34a00 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20  pOvflPage) ){.  
34a10 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34a20 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
34a30 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ext, "failed to 
34a40 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50  get page %d", iP
34a50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  age);.      brea
34a60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76  k;.    }.    pOv
34a70 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e  flData = (unsign
34a80 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
34a90 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f  3PagerGetData(pO
34aa0 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66  vflPage);.    if
34ab0 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a  ( isFreeList ){.
34ac0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65        int n = ge
34ad0 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
34ae0 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  a[4]);.#ifndef S
34af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
34b00 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
34b10 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
34b20 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
34b30 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
34b40 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54  Check, iPage, PT
34b50 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
34b60 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
34b70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
34b80 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e    if( n>pCheck->
34b90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
34ba0 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 63  4-2 ){.        c
34bb0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34bc0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
34bd0 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65             "free
34be0 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20  list leaf count 
34bf0 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20  too big on page 
34c00 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
34c10 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20       N--;.      
34c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
34c30 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
34c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  ){.          Pgn
34c50 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65  o iFreePage = ge
34c60 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
34c70 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64  a[8+i*4]);.#ifnd
34c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34c90 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
34ca0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
34cb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
34cd0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
34ce0 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54  k, iFreePage, PT
34cf0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
34d00 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
34d10 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
34d20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52            checkR
34d30 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ef(pCheck, iFree
34d40 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
34d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34d60 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20     N -= n;.     
34d70 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
34d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34d90 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65  OVACUUM.    else
34da0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
34db0 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70  is database supp
34dc0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
34dd0 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f   and iPage is no
34de0 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  t the last.     
34df0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
34e00 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20   overflow list, 
34e10 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
34e20 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
34e30 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
34e40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65  e following page
34e50 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a   matches iPage..
34e60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
34e70 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
34e80 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e  autoVacuum && N>
34e90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
34ea0 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
34eb0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ata);.        ch
34ec0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
34ed0 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
34ee0 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
34ef0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
34f00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
34f10 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
34f20 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
34f30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
34f40 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b  nref(pOvflPage);
34f50 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
34f60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
34f70 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
34f80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34f90 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
34fa0 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61  HECK./*.** Do va
34fb0 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65  rious sanity che
34fc0 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  cks on a single 
34fd0 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20  page of a tree. 
34fe0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74   Return.** the t
34ff0 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74  ree depth.  Root
35000 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e   pages return 0.
35010 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f    Parents of roo
35020 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72  t pages.** retur
35030 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  n 1, and so fort
35040 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20  h..** .** These 
35050 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a  checks are done:
35060 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20  .**.**      1.  
35070 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63  Make sure that c
35080 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f  ells and freeblo
35090 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c  cks do not overl
350a0 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62  ap.**          b
350b0 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f  ut combine to co
350c0 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74  mpletely cover t
350d0 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20  he page..**  NO 
350e0 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63   2.  Make sure c
350f0 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20  ell keys are in 
35100 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33  order..**  NO  3
35110 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
35120 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  key is less than
35130 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f   or equal to zLo
35140 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f  werBound..**  NO
35150 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    4.  Make sure 
35160 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65  no key is greate
35170 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
35180 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a  to zUpperBound..
35190 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63  **      5.  Chec
351a0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
351b0 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
351c0 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52  s..**      6.  R
351d0 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20  ecursively call 
351e0 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e  checkTreePage on
351f0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a   all children..*
35200 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66  *      7.  Verif
35210 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68  y that the depth
35220 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
35230 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a   is the same..**
35240 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73        8.  Make s
35250 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73  ure this page is
35260 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75   at least 33% fu
35270 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  ll or else it is
35280 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65  .**          the
35290 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
352a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
352b0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a   checkTreePage(.
352c0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
352d0 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65  Check,  /* Conte
352e0 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74  xt for the sanit
352f0 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  y check */.  int
35300 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
35310 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
35320 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
35330 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63 68 61 72   check */.  char
35340 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74   *zParentContext
35350 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74    /* Parent cont
35360 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ext */.){.  MemP
35370 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
35380 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20  t i, rc, depth, 
35390 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20  d2, pgno, cnt;. 
353a0 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74   int hdr, cellSt
353b0 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  art;.  int nCell
353c0 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20  ;.  u8 *data;.  
353d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
353e0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
353f0 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74  .  char zContext
35400 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68  [100];.  char *h
35410 69 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  it = 0;..  sqlit
35420 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35430 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
35440 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
35450 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
35460 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
35470 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
35480 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
35490 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
354a0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
354b0 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
354c0 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
354d0 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
354e0 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
354f0 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
35500 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
35510 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
35520 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
35530 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
35540 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
35550 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35560 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65  ITE_NOMEM ) pChe
35570 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
35580 20 3d 20 31 3b 0a 20 20 20 20 63 68 65 63 6b 41   = 1;.    checkA
35590 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
355a0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
355b0 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74    "unable to get
355c0 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72   the page. error
355d0 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a   code=%d", rc);.
355e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
355f0 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  }.  if( (rc = sq
35600 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
35610 67 65 28 70 50 61 67 65 29 29 21 3d 30 20 29 7b  ge(pPage))!=0 ){
35620 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35630 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65  ITE_NOMEM ) pChe
35640 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
35650 20 3d 20 31 3b 0a 20 20 20 20 63 68 65 63 6b 41   = 1;.    checkA
35660 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
35670 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
35680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
35690 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
356a0 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65  Page() returns e
356b0 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72  rror code %d", r
356c0 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  c);.    releaseP
356d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
356e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
356f0 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c   /* Check out al
35700 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a  l the cells..  *
35710 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20  /.  depth = 0;. 
35720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
35730 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65  e->nCell && pChe
35740 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  ck->mxErr; i++){
35750 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  .    u8 *pCell;.
35760 20 20 20 20 75 33 32 20 73 7a 3b 0a 20 20 20 20      u32 sz;.    
35770 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
35780 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79      /* Check pay
35790 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  load overflow pa
357a0 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ges.    */.    s
357b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
357c0 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
357d0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
357e0 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65           "On tre
357f0 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
35800 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
35810 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
35820 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
35830 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
35840 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
35850 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
35860 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f  );.    sz = info
35870 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  .nData;.    if( 
35880 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
35890 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79   sz += info.nKey
358a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
358b0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
358c0 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e  );.    if( sz>in
358d0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
358e0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28     int nPage = (
358f0 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  sz - info.nLocal
35900 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   + usableSize - 
35910 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d  5)/(usableSize -
35920 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20   4);.      Pgno 
35930 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
35940 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
35950 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66  iOverflow]);.#if
35960 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35970 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
35980 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
35990 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
359a0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
359b0 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  eck, pgnoOvfl, P
359c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
359d0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
359e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
359f0 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73  f.      checkLis
35a00 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e  t(pCheck, 0, pgn
35a10 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43  oOvfl, nPage, zC
35a20 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a  ontext);.    }..
35a30 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e      /* Check san
35a40 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c  ity of left chil
35a50 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  d page..    */. 
35a60 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
35a70 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  eaf ){.      pgn
35a80 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
35a90 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
35aa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
35ab0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
35ac0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
35ad0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
35ae0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
35af0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
35b00 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
35b10 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
35b20 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65  f.      d2 = che
35b30 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
35b40 6b 2c 20 70 67 6e 6f 2c 20 7a 43 6f 6e 74 65 78  k, pgno, zContex
35b50 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  t);.      if( i>
35b60 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29  0 && d2!=depth )
35b70 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
35b80 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
35b90 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c   zContext, "Chil
35ba0 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66  d page depth dif
35bb0 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  fers");.      }.
35bc0 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32        depth = d2
35bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
35be0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35bf0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
35c00 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
35c10 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
35c20 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71  fset+8]);.    sq
35c30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
35c40 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
35c50 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c70 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20   "On page %d at 
35c80 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20  right child: ", 
35c90 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
35ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35cb0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
35cc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
35cd0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
35ce0 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
35cf0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
35d00 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  iPage, 0);.    }
35d10 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
35d20 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
35d30 2c 20 70 67 6e 6f 2c 20 7a 43 6f 6e 74 65 78 74  , pgno, zContext
35d40 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68  );.  }. .  /* Ch
35d50 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65  eck for complete
35d60 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65   coverage of the
35d70 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74   page.  */.  dat
35d80 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
35d90 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
35da0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69  >hdrOffset;.  hi
35db0 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  t = sqlite3PageM
35dc0 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
35dd0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69  Size );.  if( hi
35de0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 68 65  t==0 ){.    pChe
35df0 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
35e00 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
35e10 20 20 20 75 31 36 20 63 6f 6e 74 65 6e 74 4f 66     u16 contentOf
35e20 66 73 65 74 20 3d 20 67 65 74 32 62 79 74 65 28  fset = get2byte(
35e30 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
35e40 20 20 20 69 66 20 28 63 6f 6e 74 65 6e 74 4f 66     if (contentOf
35e50 66 73 65 74 20 3e 20 75 73 61 62 6c 65 53 69 7a  fset > usableSiz
35e60 65 29 20 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  e) {.      check
35e70 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
35e80 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
35e90 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
35ea0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
35eb0 69 6e 20 68 65 61 64 65 72 20 6f 6e 20 70 61 67  in header on pag
35ec0 65 20 25 64 22 2c 69 50 61 67 65 2c 30 29 3b 0a  e %d",iPage,0);.
35ed0 20 20 20 20 20 20 67 6f 74 6f 20 63 68 65 63 6b        goto check
35ee0 5f 70 61 67 65 5f 61 62 6f 72 74 3b 0a 20 20 20  _page_abort;.   
35ef0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69   }.    memset(hi
35f00 74 2b 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 2c  t+contentOffset,
35f10 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63   0, usableSize-c
35f20 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20  ontentOffset);. 
35f30 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31     memset(hit, 1
35f40 2c 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29  , contentOffset)
35f50 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65  ;.    nCell = ge
35f60 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
35f70 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74  +3]);.    cellSt
35f80 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  art = hdr + 12 -
35f90 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
35fa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
35fb0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
35fc0 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62    int pc = get2b
35fd0 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74  yte(&data[cellSt
35fe0 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  art+i*2]);.     
35ff0 20 75 31 36 20 73 69 7a 65 20 3d 20 31 30 32 34   u16 size = 1024
36000 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
36010 20 20 20 20 20 69 66 28 20 70 63 3c 3d 75 73 61       if( pc<=usa
36020 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
36030 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69     size = cellSi
36040 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
36050 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[pc]);.      }
36060 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b 73  .      if( (pc+s
36070 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
36080 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20  ze || pc<0 ){.  
36090 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
360a0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
360b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
360c0 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
360d0 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
360e0 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
360f0 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
36100 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
36110 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63  pc+size-1; j>=pc
36120 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
36130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36140 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d     for(cnt=0, i=
36150 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
36160 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69  dr+1]); i>0 && i
36170 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  <usableSize && c
36180 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20  nt<10000; .     
36190 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20        cnt++){.  
361a0 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
361b0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b  et2byte(&data[i+
361c0 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  2]);.      int j
361d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b 73  ;.      if( (i+s
361e0 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69  ize-1)>=usableSi
361f0 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20  ze || i<0 ){.   
36200 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
36210 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20  Msg(pCheck, 0,  
36220 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f  .            "Co
36230 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
36240 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20  d in cell %d on 
36250 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65  page %d",i,iPage
36260 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,0);.      }else
36270 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
36280 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20  i+size-1; j>=i; 
36290 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
362a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
362b0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
362c0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
362d0 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73  or(i=cnt=0; i<us
362e0 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  ableSize; i++){.
362f0 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d        if( hit[i]
36300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
36310 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
36320 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29  e if( hit[i]>1 )
36330 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
36340 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
36350 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d   0,.          "M
36360 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72  ultiple uses for
36370 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67 65   byte %d of page
36380 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b   %d", i, iPage);
36390 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
363a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
363b0 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b    if( cnt!=data[
363c0 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20  hdr+7] ){.      
363d0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
363e0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
363f0 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64       "Fragmented
36400 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79 74   space is %d byt
36410 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25 64  e reported as %d
36420 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20   on page %d",.  
36430 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74          cnt, dat
36440 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29  a[hdr+7], iPage)
36450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 63 68 65 63  ;.    }.  }.chec
36460 6b 5f 70 61 67 65 5f 61 62 6f 72 74 3a 0a 20 20  k_page_abort:.  
36470 69 66 20 28 68 69 74 29 20 73 71 6c 69 74 65 33  if (hit) sqlite3
36480 50 61 67 65 46 72 65 65 28 68 69 74 29 3b 0a 0a  PageFree(hit);..
36490 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
364a0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  age);.  return d
364b0 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66  epth+1;.}.#endif
364c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
364d0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
364e0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
364f0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
36500 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  Y_CHECK./*.** Th
36510 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
36520 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b  a complete check
36530 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54   of the given BT
36540 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74  ree file.  aRoot
36550 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61  [] is.** an arra
36560 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65  y of pages numbe
36570 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67  rs were each pag
36580 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  e number is the 
36590 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
365a0 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20  a table.  nRoot 
365b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
365c0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
365d0 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  t..**.** Write t
365e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
365f0 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e 45 72  or seen in *pnEr
36600 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72 20 73  r.  Except for s
36610 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  ome memory.** al
36620 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c  location errors,
36630 20 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61    an error messa
36640 67 65 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ge held in memor
36650 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
36660 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73 20 72 65 74  ** malloc is ret
36670 75 72 6e 65 64 20 69 66 20 2a 70 6e 45 72 72 20  urned if *pnErr 
36680 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  is non-zero.  If
36690 20 2a 70 6e 45 72 72 3d 3d 30 20 74 68 65 6e 20   *pnErr==0 then 
366a0 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65 74 75 72  NULL is.** retur
366b0 6e 65 64 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ned.  If a memor
366c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
366d0 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
366e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
366f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
36700 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  eeIntegrityCheck
36710 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
36720 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
36730 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
36740 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20    int *aRoot,   
36750 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72  /* An array of r
36760 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72  oot pages number
36770 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c  s for individual
36780 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20   trees */.  int 
36790 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d  nRoot,    /* Num
367a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
367b0 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69  n aRoot[] */.  i
367c0 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20  nt mxErr,    /* 
367d0 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65  Stop reporting e
367e0 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73  rrors after this
367f0 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a   many */.  int *
36800 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74  pnErr    /* Writ
36810 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
36820 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20  rs seen to this 
36830 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  variable */.){. 
36840 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20 6e   Pgno i;.  int n
36850 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79  Ref;.  Integrity
36860 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53  Ck sCheck;.  BtS
36870 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
36880 70 42 74 3b 0a 20 20 63 68 61 72 20 7a 45 72 72  pBt;.  char zErr
36890 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  [100];..  sqlite
368a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
368b0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
368c0 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69  b;.  nRef = sqli
368d0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
368e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
368f0 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69   if( lockBtreeWi
36900 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49  thRetry(p)!=SQLI
36910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e  TE_OK ){.    *pn
36920 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Err = 1;.    sql
36930 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
36940 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
36950 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
36960 20 22 63 61 6e 6e 6f 74 20 61 63 71 75 69 72 65   "cannot acquire
36970 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
36980 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a  the database");.
36990 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74    }.  sCheck.pBt
369a0 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b   = pBt;.  sCheck
369b0 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  .pPager = pBt->p
369c0 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e  Pager;.  sCheck.
369d0 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
369e0 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 42  ecount(sCheck.pB
369f0 74 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  t);.  sCheck.mxE
36a00 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
36a10 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
36a20 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61   sCheck.mallocFa
36a30 69 6c 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45  iled = 0;.  *pnE
36a40 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rr = 0;.#ifndef 
36a50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
36a60 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
36a70 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ->nTrunc!=0 ){. 
36a80 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20     sCheck.nPage 
36a90 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
36aa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
36ab0 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20  sCheck.nPage==0 
36ac0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
36ad0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
36ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
36af0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
36b00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
36b10 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71  Check.anRef = sq
36b20 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43  lite3Malloc( (sC
36b30 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
36b40 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
36b50 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
36b60 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
36b70 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
36b80 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
36b90 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
36ba0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
36bb0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
36bc0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
36bd0 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=0; i<=sCheck.n
36be0 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65  Page; i++){ sChe
36bf0 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b  ck.anRef[i] = 0;
36c00 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47   }.  i = PENDING
36c10 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b  _BYTE_PAGE(pBt);
36c20 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b  .  if( i<=sCheck
36c30 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43  .nPage ){.    sC
36c40 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
36c50 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
36c60 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43  StrAccumInit(&sC
36c70 68 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72  heck.errMsg, zEr
36c80 72 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c  r, sizeof(zErr),
36c90 20 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43   20000);..  /* C
36ca0 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
36cb0 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
36cc0 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
36cd0 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
36ce0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
36cf0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
36d00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
36d10 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
36d20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
36d30 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
36d40 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
36d50 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
36d60 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
36d70 3b 20 28 69 6e 74 29 69 3c 6e 52 6f 6f 74 20 26  ; (int)i<nRoot &
36d80 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
36d90 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52  i++){.    if( aR
36da0 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  oot[i]==0 ) cont
36db0 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  inue;.#ifndef SQ
36dc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
36dd0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
36de0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
36df0 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  aRoot[i]>1 ){.  
36e00 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
36e10 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69  &sCheck, aRoot[i
36e20 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  ], PTRMAP_ROOTPA
36e30 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  GE, 0, 0);.    }
36e40 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63  .#endif.    chec
36e50 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63  kTreePage(&sChec
36e60 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 22 4c 69  k, aRoot[i], "Li
36e70 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
36e80 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
36e90 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
36ea0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
36eb0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
36ec0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
36ed0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
36ee0 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
36ef0 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
36f00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36f10 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
36f20 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
36f30 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
36f40 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
36f50 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
36f60 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
36f70 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
36f80 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
36f90 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
36fa0 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
36fb0 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
36fc0 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
36fd0 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
36fe0 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
36ff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
37000 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
37010 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
37020 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
37030 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
37040 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
37050 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
37060 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
37070 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
37080 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
37090 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
370a0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
370b0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
370c0 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
370d0 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
370e0 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
370f0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
37100 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
37110 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
37120 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
37130 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
37140 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
37150 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
37160 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
37170 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
37180 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
37190 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
371a0 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
371b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
371c0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
371d0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
371e0 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
371f0 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
37200 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
37210 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
37220 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
37230 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
37240 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
37250 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
37260 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
37270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
37280 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
37290 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
372a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
372b0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
372c0 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
372d0 29 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  );.  if( sCheck.
372e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
372f0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
37300 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b  cumReset(&sCheck
37310 2e 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70  .errMsg);.    *p
37320 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45  nErr = sCheck.nE
37330 72 72 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr+1;.    return
37340 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72   0;.  }.  *pnErr
37350 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a   = sCheck.nErr;.
37360 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72    if( sCheck.nEr
37370 72 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74  r==0 ) sqlite3St
37380 72 41 63 63 75 6d 52 65 73 65 74 28 26 73 43 68  rAccumReset(&sCh
37390 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72  eck.errMsg);.  r
373a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
373b0 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68  AccumFinish(&sCh
373c0 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23  eck.errMsg);.}.#
373d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
373e0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
373f0 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  HECK */../*.** R
37400 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
37410 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75  athname of the u
37420 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
37430 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
37440 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d  he pager filenam
37450 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
37460 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
37470 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
37480 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
37490 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
374a0 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
374b0 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
374c0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
374d0 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20  tFilename(Btree 
374e0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
374f0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
37500 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
37510 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
37520 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
37530 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
37540 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
37550 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
37560 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
37570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37580 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
37590 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65  r directory name
375a0 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73   is invariant as
375b0 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67   long as the pag
375c0 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f  er is.** open so
375d0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61   it is safe to a
375e0 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68  ccess without th
375f0 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78  e BtShared mutex
37600 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
37610 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
37620 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  Dirname(Btree *p
37630 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
37640 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
37650 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
37660 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70  e3PagerDirname(p
37670 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
37680 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37690 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
376a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
376b0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
376c0 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  se. The return.*
376d0 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
376e0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
376f0 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ame regardless o
37700 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f  f whether the jo
37710 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61  urnal file.** ha
37720 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  s been created o
37730 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r not..**.** The
37740 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66   pager journal f
37750 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72  ilename is invar
37760 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20  iant as long as 
37770 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20  the pager is.** 
37780 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61  open so it is sa
37790 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74  fe to access wit
377a0 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65  hout the BtShare
377b0 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73  d mutex..*/.cons
377c0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
377d0 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
377e0 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
377f0 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
37800 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
37810 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
37820 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d  erJournalname(p-
37830 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
37840 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
37850 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
37860 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70  ** Copy the comp
37870 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
37880 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74  pBtFrom into pBt
37890 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  To.  A transacti
378a0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63  on.** must be ac
378b0 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69  tive for both fi
378c0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  les..**.** The s
378d0 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20  ize of file pTo 
378e0 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62  may be reduced b
378f0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
37900 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  ..** If anything
37910 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65   goes wrong, the
37920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
37930 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  pTo is rolled ba
37940 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ck. .**.** If su
37950 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74  ccessful, Commit
37960 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62  PhaseOne() may b
37970 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20  e called on pTo 
37980 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
37990 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  . .** The caller
379a0 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63   should finish c
379b0 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72  ommitting the tr
379c0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
379d0 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73   by calling.** s
379e0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
379f0 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  t()..*/.static i
37a00 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65  nt btreeCopyFile
37a10 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72  (Btree *pTo, Btr
37a20 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e  ee *pFrom){.  in
37a30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37a40 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50  ;.  Pgno i;..  P
37a50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20  gno nFromPage;  
37a60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37a70 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a  pages in pFrom *
37a80 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65  /.  Pgno nToPage
37a90 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
37aa0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
37ab0 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77  o */.  Pgno nNew
37ac0 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75  Page;      /* Nu
37ad0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
37ae0 20 70 54 6f 20 61 66 74 65 72 20 74 68 65 20 63   pTo after the c
37af0 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69  opy */..  Pgno i
37b00 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  Skip;         /*
37b10 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61   Pending byte pa
37b20 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69  ge in pTo */.  i
37b30 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  nt nToPageSize; 
37b40 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
37b50 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20  of pTo in bytes 
37b60 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61  */.  int nFromPa
37b70 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65  geSize;  /* Page
37b80 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69   size of pFrom i
37b90 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74  n bytes */..  Bt
37ba0 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
37bb0 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
37bc0 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
37bd0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42  pFrom->pBt;.  pB
37be0 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64  tTo->db = pTo->d
37bf0 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62  b;.  pBtFrom->db
37c00 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20   = pFrom->db;.. 
37c10 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70   nToPageSize = p
37c20 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  BtTo->pageSize;.
37c30 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20    nFromPageSize 
37c40 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53  = pBtFrom->pageS
37c50 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d  ize;..  if( pTo-
37c60 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
37c70 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e  WRITE || pFrom->
37c80 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
37c90 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
37ca0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
37cb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f  .  }.  if( pBtTo
37cc0 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
37cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37ce0 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50  USY;.  }..  nToP
37cf0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
37d00 6f 75 6e 74 28 70 42 74 54 6f 29 3b 0a 20 20 6e  ount(pBtTo);.  n
37d10 46 72 6f 6d 50 61 67 65 20 3d 20 70 61 67 65 72  FromPage = pager
37d20 50 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f  Pagecount(pBtFro
37d30 6d 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45  m);.  iSkip = PE
37d40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37d50 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61  pBtTo);..  /* Va
37d60 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20  riable nNewPage 
37d70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
37d80 20 70 61 67 65 73 20 72 65 71 75 69 72 65 64 20   pages required 
37d90 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a  to store the.  *
37da0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46  * contents of pF
37db0 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75  rom using the cu
37dc0 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20  rrent page-size 
37dd0 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  of pTo..  */.  n
37de0 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36 34 29  NewPage = ((i64)
37df0 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34  nFromPage * (i64
37e00 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b  )nFromPageSize +
37e10 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
37e20 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20  e - 1) / .      
37e30 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
37e40 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63  ;..  for(i=1; rc
37e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
37e60 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c  i<=nToPage || i<
37e70 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29  =nNewPage); i++)
37e80 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  {..    /* Journa
37e90 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  l the original p
37ea0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
37eb0 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65 20  ** iSkip is the 
37ec0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
37ed0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20  he locking page 
37ee0 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  (PENDING_BYTE_PA
37ef0 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61  GE).    ** in da
37f00 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66  tabase *pTo (bef
37f10 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54  ore the copy). T
37f20 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 76 65  his page is neve
37f30 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a  r written .    *
37f40 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  * into the journ
37f50 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20  al file. Unless 
37f60 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20  i==iSkip or the 
37f70 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20  page was not.   
37f80 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70   ** present in p
37f90 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  To before the co
37fa0 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f  py operation, jo
37fb0 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f  urnal page i fro
37fc0 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  m pTo..    */.  
37fd0 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26    if( i!=iSkip &
37fe0 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a  & i<=nToPage ){.
37ff0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
38000 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  bPage = 0;.     
38010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
38020 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
38030 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65  ger, i, &pDbPage
38040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
38050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38060 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
38070 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
38080 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
38090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
380a0 20 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20   && i>nFromPage 
380b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
380c0 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20  Yeah.  It seems 
380d0 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f  wierd to call Do
380e0 6e 74 57 72 69 74 65 28 29 20 72 69 67 68 74 20  ntWrite() right 
380f0 61 66 74 65 72 20 57 72 69 74 65 28 29 2e 20 42  after Write(). B
38100 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ut.          ** 
38110 74 68 61 74 20 69 73 20 62 65 63 61 75 73 65 20  that is because 
38120 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f  the names of tho
38130 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f  se procedures do
38140 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20   not exactly .  
38150 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65          ** repre
38160 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20 64  sent what they d
38170 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61 6c  o.  Write() real
38180 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68  ly means "put th
38190 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20  is page in the. 
381a0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c           ** roll
381b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
381c0 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72 74   mark it as dirt
381d0 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
381e0 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  l be written.   
381f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65         ** to the
38200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
38210 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
38220 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
38230 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
38240 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
38250 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65  and prevents the
38260 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
38270 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
38280 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20  database. The.  
38290 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
382a0 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  is still on the 
382b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
382c0 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74  , though.  And t
382d0 68 61 74 20 69 73 20 74 68 65 20 0a 20 20 20 20  hat is the .    
382e0 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70        ** whole p
382f0 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62 6c 6f  oint of this blo
38300 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73  ck: to put pages
38310 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   on the rollback
38320 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
38330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
38340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
38350 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
38360 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
38370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
38380 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
38390 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
383a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   }..    /* Overw
383b0 72 69 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  rite the data in
383c0 20 70 61 67 65 20 69 20 6f 66 20 74 68 65 20 74   page i of the t
383d0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a  arget database *
383e0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
383f0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53  LITE_OK && i!=iS
38400 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61  kip && i<=nNewPa
38410 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50  ge ){..      DbP
38420 61 67 65 2