/ Hex Artifact Content
Login

Artifact fb64a2afba6d417b78d6727c4de34a821495ed1e:


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 38 20 32 30 30 38 2f 31  c,v 1.548 2008/1
0190: 32 2f 31 36 20 31 33 3a 34 36 3a 33 30 20 64 72  2/16 13:46:30 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
0420: 20 53 6f 6d 65 74 69 6d 65 73 20 77 65 20 6e 65   Sometimes we ne
0430: 65 64 20 61 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e  ed a small amoun
0440: 74 20 6f 66 20 63 6f 64 65 20 73 75 63 68 20 61  t of code such a
0450: 73 20 61 20 76 61 72 69 61 62 6c 65 20 69 6e 69  s a variable ini
0460: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74  tialization.** t
0470: 6f 20 73 65 74 75 70 20 66 6f 72 20 61 20 6c 61  o setup for a la
0480: 74 65 72 20 61 73 73 65 72 74 28 29 20 73 74 61  ter assert() sta
0490: 74 65 6d 65 6e 74 2e 20 20 57 65 20 64 6f 20 6e  tement.  We do n
04a0: 6f 74 20 77 61 6e 74 20 74 68 69 73 20 63 6f 64  ot want this cod
04b0: 65 20 74 6f 0a 2a 2a 20 61 70 70 65 61 72 20 77  e to.** appear w
04c0: 68 65 6e 20 61 73 73 65 72 74 28 29 20 69 73 20  hen assert() is 
04d0: 64 69 73 61 62 6c 65 64 2e 20 20 54 68 65 20 66  disabled.  The f
04e0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 69  ollowing macro i
04f0: 73 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 75  s therefore.** u
0500: 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
0510: 68 61 74 20 73 65 74 75 70 20 63 6f 64 65 2e 20  hat setup code. 
0520: 20 54 68 65 20 22 56 56 41 22 20 61 63 72 6f 6e   The "VVA" acron
0530: 79 6d 20 73 74 61 6e 64 73 20 66 6f 72 0a 2a 2a  ym stands for.**
0540: 20 22 56 65 72 69 66 69 63 61 74 69 6f 6e 2c 20   "Verification, 
0550: 56 61 6c 69 64 61 74 69 6f 6e 2c 20 61 6e 64 20  Validation, and 
0560: 41 63 63 72 65 64 69 74 61 74 69 6f 6e 22 2e 20  Accreditation". 
0570: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
0580: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
0590: 68 69 6e 20 56 56 41 5f 4f 4e 4c 59 28 29 20 77  hin VVA_ONLY() w
05a0: 69 6c 6c 20 6f 6e 6c 79 20 72 75 6e 20 64 75 72  ill only run dur
05b0: 69 6e 67 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ing verification
05c0: 20 70 72 6f 63 65 73 73 65 73 2e 0a 2a 2f 0a 23   processes..*/.#
05d0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 20  ifndef NDEBUG.# 
05e0: 64 65 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 28  define VVA_ONLY(
05f0: 58 29 20 20 58 0a 23 65 6c 73 65 0a 23 20 64 65  X)  X.#else.# de
0600: 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 28 58 29  fine VVA_ONLY(X)
0610: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 6e 64  .#endif....#ifnd
0620: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0630: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
0640: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
0650: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0660: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0670: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0680: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0690: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
06a0: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
06b0: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
06c0: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
06d0: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
06e0: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
06f0: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
0700: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
0710: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f   test builds..*/
0720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0730: 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a 53 51  EST.BtShared *SQ
0740: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
0750: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
0760: 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
0770: 63 20 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49  c BtShared *SQLI
0780: 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68  TE_WSD sqlite3Sh
0790: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
07a0: 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  0;.#endif.#endif
07b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
07c0: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
07d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
07e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
07f0: 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  E./*.** Enable o
0800: 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 68  r disable the sh
0810: 61 72 65 64 20 70 61 67 65 72 20 61 6e 64 20 73  ared pager and s
0820: 63 68 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a  chema features..
0830: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0840: 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ne has no effect
0850: 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   on existing dat
0860: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0870: 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  s..** The shared
0880: 20 63 61 63 68 65 20 73 65 74 74 69 6e 67 20 65   cache setting e
0890: 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75  ffects only futu
08a0: 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  re calls to.** s
08b0: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73  qlite3_open(), s
08c0: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c  qlite3_open16(),
08d0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   or sqlite3_open
08e0: 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _v2()..*/.int sq
08f0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
0900: 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e  red_cache(int en
0910: 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  able){.  sqlite3
0920: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
0930: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
0940: 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75  = enable;.  retu
0950: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0960: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46  #endif.../*.** F
0970: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0980: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
0990: 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
09a0: 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74  Btree*, Pgno, Bt
09b0: 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a  Cursor*, i64);..
09c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
09d0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
09e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
09f0: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0a00: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0a10: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
0a20: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
0a30: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a40: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a60: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a70: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a80: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a90: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0aa0: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0ab0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0ac0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0ad0: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0ae0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0af0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0b00: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0b10: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0b20: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0b30: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b40: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b50: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b60: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b70: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b80: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b90: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
0ba0: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0bb0: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
0bc0: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0bd0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0be0: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0bf0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0c00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0c10: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0c20: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0c30: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0c40: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0c50: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0c60: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0c70: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0c80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0c90: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0ca0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0cb0: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0cc0: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0cd0: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0ce0: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0cf0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0d00: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0d10: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0d20: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0d30: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0d40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0d50: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0d60: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0d70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0d80: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0d90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0da0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0db0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0dc0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0dd0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0de0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
0df0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
0e00: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
0e10: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
0e20: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
0e30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0e40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
0e50: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
0e60: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
0e70: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
0e80: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
0e90: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
0ea0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
0eb0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
0ec0: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
0ed0: 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  && pBt->pExclusi
0ee0: 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74  ve!=p ){.    ret
0ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0f00: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
0f10: 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f  s (along with lo
0f20: 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68  ckTable()) is wh
0f30: 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ere the ReadUnco
0f40: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a  mmitted flag is.
0f50: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e    ** dealt with.
0f60: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
0f70: 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61  s querying for a
0f80: 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74   read-lock and t
0f90: 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20  he flag is.  ** 
0fa0: 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e  set, it is uncon
0fb0: 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74  ditionally grant
0fc0: 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65  ed - even if the
0fd0: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
0fe0: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
0ff0: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
1000: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
1010: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
1020: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
1030: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
1040: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
1050: 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54  n function lockT
1060: 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61  able(), if a rea
1070: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
1080: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
1090: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
10a0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
10b0: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
10c0: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
10d0: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
10e0: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
10f0: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
1100: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
1110: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1120: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
1130: 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20  cursors do.  ** 
1140: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
1150: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
1160: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70  s. The locking p
1170: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a  rocedure for a .
1180: 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f    ** write-curso
1190: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
11a0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
11b0: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
11c0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
11d0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
11e0: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
11f0: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
1200: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
1210: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1220: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1230: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1240: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1250: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1260: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
1270: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a  Table==iTab && .
1280: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
1290: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c  ->eLock!=eLock |
12a0: 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f  | eLock!=READ_LO
12b0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  CK) ){.        r
12c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
12d0: 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
12e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1300: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1310: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1320: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1330: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1340: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
1350: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
1360: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
1370: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
1380: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
1390: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
13a0: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
13b0: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
13c0: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
13d0: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
13e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13f0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1400: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1410: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
1420: 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ly. SQLITE_BUSY 
1430: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  and.** SQLITE_NO
1440: 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  MEM may also be 
1450: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1460: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c  tic int lockTabl
1470: 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
1480: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1490: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
14a0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14b0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
14c0: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
14d0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
14e0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
14f0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1500: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1510: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
1520: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
1530: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
1540: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
1550: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1560: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1570: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1580: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1590: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
15a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
15c0: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c  TE_OK==queryTabl
15d0: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
15e0: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
15f0: 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63   If the read-unc
1600: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1610: 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d   set and a read-
1620: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
1630: 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65  d,.  ** return e
1640: 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64  arly without add
1650: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
1660: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
1670: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1680: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1690: 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65  ction queryTable
16a0: 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20  Lock() for more 
16b0: 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67  info on handling
16c0: 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55   .  ** the ReadU
16d0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e  ncommitted flag.
16e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
16f0: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53   (p->db->flags&S
1700: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1710: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
1720: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1730: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
1740: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1750: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1760: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1770: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1780: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1790: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
17a0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
17b0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
17c0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
17d0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
17e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
17f0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1800: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
1810: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
1820: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
1830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1840: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1850: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
1860: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
1870: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1880: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1890: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
18a0: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
18b0: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
18c0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
18d0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
18e0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
18f0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
1900: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
1910: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
1920: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
1930: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1950: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
1960: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
1970: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
1980: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
1990: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
19a0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
19b0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
19c0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
19d0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
19e0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
19f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1a00: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
1a10: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1a20: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
1a30: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
1a40: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
1a50: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
1a60: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
1a70: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
1a80: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
1a90: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
1aa0: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
1ab0: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
1ac0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
1ad0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
1ae0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
1af0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
1b00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1b10: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
1b20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1b30: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
1b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1b50: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
1b60: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
1b70: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
1b80: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
1b90: 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54  lls to the lockT
1ba0: 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64  able().** proced
1bb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1bc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
1bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1be0: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65  ckAllTables(Btre
1bf0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1c00: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c10: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
1c20: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
1c30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1c40: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1c50: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1c60: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1c70: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1c80: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1c90: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
1ca0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
1cb0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1cc0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1cd0: 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75  0 || pBt->pExclu
1ce0: 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  sive==pLock->pBt
1cf0: 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ree );.    if( p
1d00: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
1d10: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
1d20: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
1d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1d40: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
1d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
1d60: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
1d70: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
1d80: 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c    if( pBt->pExcl
1d90: 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20  usive==p ){.    
1da0: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
1db0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
1dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1dd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1de0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1df0: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1e00: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
1e10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1e20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
1e30: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
1e40: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
1e50: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
1e60: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1e70: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
1e80: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
1e90: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
1ea0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1eb0: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
1ec0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
1ed0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1ee0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1ef0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1f00: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1f10: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1f20: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
1f30: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
1f40: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
1f50: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
1f60: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1f70: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f80: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1fa0: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
1fb0: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
1fc0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
1fd0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
1fe0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1ff0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
2000: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
2010: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
2020: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
2030: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
2040: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
2050: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
2060: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
2070: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2080: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2090: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20b0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
20c0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
20d0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
20e0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
20f0: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
2100: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
2110: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
2120: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
2130: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
2140: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
2150: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
2160: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2170: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
2180: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
2190: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
21a0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
21b0: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
21c0: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
21d0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
21e0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
21f0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2200: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2210: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
2220: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2230: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2240: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
2250: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
2260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
2270: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2280: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
2290: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
22a0: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
22b0: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
22c0: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
22d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
22e0: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
22f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
2300: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
2310: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
2320: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
2330: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
2340: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
2350: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
2360: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
2370: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
2380: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
2390: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
23a0: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
23b0: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
23c0: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
23d0: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
23e0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
23f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
2400: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2410: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
2420: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
2430: 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43  3Malloc( (int)pC
2440: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
2450: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
2460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2470: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
2480: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
2490: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
24a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
24c0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
24d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24f0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
2500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2520: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
2530: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
2540: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
2550: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
2560: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2580: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2590: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
25a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
25b0: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
25c0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
25d0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
25e0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
25f0: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
2600: 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  1;.    pCur->eSt
2610: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
2620: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
2630: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
2640: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
2650: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2660: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
2670: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
2680: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
2690: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
26a0: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
26b0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
26c0: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
26d0: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
26e0: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
26f0: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
2700: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
2710: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
2720: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
2730: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
2740: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
2750: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
2760: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
2770: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
2780: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
27c0: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
27d0: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
27e0: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
27f0: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2800: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2810: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
2820: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
2830: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
2840: 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20  =iRoot) && .    
2850: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43      p->eState==C
2860: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2870: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
2880: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2890: 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  (p);.      if( S
28a0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
28b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
28c0: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
28d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
28e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28f0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
2900: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2910: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2920: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
2930: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
2940: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
2950: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2960: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
2970: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
2980: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
2990: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
29a0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29b0: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
29c0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
29d0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
29e0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
29f0: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
2a00: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
2a10: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
2a20: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
2a30: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
2a40: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
2a50: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
2a60: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
2a70: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
2a80: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
2a90: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
2aa0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
2ab0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
2ac0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
2ad0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
2ae0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
2af0: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  tion()..*/.int s
2b00: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2b10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2b20: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b30: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
2b40: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b50: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b70: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2b80: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2b90: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ba0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2bb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
2bc0: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
2bd0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2be0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2bf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c00: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
2c10: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
2c20: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
2c30: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
2c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c60: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
2c70: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2c80: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c90: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ca0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2cb0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2cc0: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
2cd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
2ce0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
2cf0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
2d00: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
2d10: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2d20: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
2d30: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2d40: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2d50: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
2d60: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
2d70: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
2d80: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
2d90: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
2da0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
2db0: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
2dc0: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
2dd0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
2de0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
2df0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
2e00: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
2e10: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
2e20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e30: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
2e40: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
2e50: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
2e60: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
2e70: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
2e80: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
2e90: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
2ea0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
2eb0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ec0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
2ed0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
2ee0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
2ef0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2f00: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
2f10: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2f20: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2f30: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
2f40: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
2f50: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
2f60: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f70: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2f80: 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20  ->skip!=0 ){.   
2f90: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
2fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2fb0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2fd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
2fe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ff0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
3000: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
3010: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
3020: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
3030: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
3040: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3050: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
3060: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3070: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
3080: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
3090: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
30a0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
30b0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
30c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
30d0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
30e0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
30f0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
3100: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3110: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3120: 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50  ex) );.  nPagesP
3130: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
3140: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
3150: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
3160: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
3170: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
3180: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
3190: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
31a0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
31b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
31d0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
31e0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
31f0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
3200: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
3210: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
3220: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
3230: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
3240: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
3250: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
3260: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
3270: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
3280: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
3290: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41  ber 'pgno'..** A
32a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
32b0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
32c0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
32d0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
32e0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
32f0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42   int ptrmapPut(B
3300: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
3310: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
3320: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a  , Pgno parent){.
3330: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
3340: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
3350: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
3360: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3370: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
3380: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
3390: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
33a0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
33b0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
33c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
33d0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
33e0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
33f0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
3400: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
3410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
3440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
3450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
3460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
3470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
3480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
3490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
34a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
34c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
34d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
34e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey==0 ){.    ret
34f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3500: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
3510: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
3520: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
3530: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3540: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
3550: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
3560: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
3570: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3580: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
3590: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
35a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
35b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
35c0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
35d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
35e0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
35f0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3600: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3610: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3620: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3630: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3640: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3650: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3660: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3670: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
3680: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
3690: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
36a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
36c0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
36d0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
36e0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
36f0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3710: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3720: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3730: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3740: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3750: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3760: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3770: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
3780: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3790: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
37a0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
37b0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
37c0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
37d0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
37e0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
37f0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3800: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3810: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3820: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3830: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3850: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3860: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3870: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
3880: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
3890: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
38a0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
38b0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
38c0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
38d0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
38e0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
38f0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3900: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3910: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3920: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3930: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3940: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3950: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3960: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3970: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3980: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
3990: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
39a0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
39b0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
39c0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
39d0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
39e0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
39f0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3a00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3a10: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3a20: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3a30: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3a40: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3a50: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
3a60: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61  trmap, key);.  a
3a70: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
3a80: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
3a90: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
3aa0: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
3ab0: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
3ac0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3ad0: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
3ae0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
3af0: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
3b00: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
3b10: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
3b20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
3b30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3b40: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
3b50: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
3b60: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
3b70: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
3b80: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
3b90: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
3ba0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
3bb0: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
3bc0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
3bd0: 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20  mapPutOvfl(y,z) 
3be0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
3bf0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
3c00: 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61  btree page and a
3c10: 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d   cell index (0 m
3c20: 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  eans the first c
3c30: 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  ell on.** the pa
3c40: 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20  ge, 1 means the 
3c50: 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64  second cell, and
3c60: 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72   so forth) retur
3c70: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
3c80: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
3c90: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
3ca0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
3cb0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
3cc0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
3cd0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
3ce0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
3cf0: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
3d00: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
3d10: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
3d20: 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61  byte(&(P)->aData
3d30: 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  [(P)->cellOffset
3d40: 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a  +2*(I)])))../*.*
3d50: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
3d60: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
3d70: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
3d80: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
3d90: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
3da0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
3db0: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
3dc0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
3dd0: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
3de0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
3df0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
3e00: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
3e10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3e20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
3e30: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
3e40: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3e50: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3e60: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
3e70: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
3e80: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
3e90: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
3ea0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
3eb0: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
3ec0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
3ed0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
3ee0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3ef0: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3f10: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3f20: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
3f30: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
3f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3f50: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
3f60: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
3f70: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
3f80: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
3f90: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
3fa0: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
3fb0: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
3fc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
3fd0: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
3fe0: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
3ff0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
4000: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4010: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
4020: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
4030: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
4040: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
4050: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
4060: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
4070: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
4080: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
4090: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
40a0: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
40b0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
40c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
40d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
40e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
40f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4100: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
4120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
4130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
4140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
4150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
4160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
4180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
4190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
41a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
41b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
41c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
41d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
41e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
41f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
4200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
4210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
4220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
4240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
4250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
4270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
4280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
4290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
42a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
42b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
42c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
42d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
42e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
42f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
4300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
4310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
4320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
4330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
4340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
4350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
4360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
4370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
4380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
4390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
43a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
43b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
43c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
43d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
43e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
43f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
4400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
4410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
4420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
4430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
4440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
4450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
4460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66  Header = n;.  if
4470: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
4480: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
4490: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
44a0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
44b0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
44c0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
44d0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
44e0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
44f0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
4500: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
4510: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
4520: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
4530: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
4540: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
4550: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
4560: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
4570: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
4580: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
4590: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
45a0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
45b0: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
45c0: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
45d0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
45e0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
45f0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
4600: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4610: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
4620: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
4630: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
4640: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
4650: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
4660: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
4670: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
4680: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
4690: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
46a0: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
46b0: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
46c0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
46d0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
46e0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
46f0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
4700: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
4710: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
4720: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
4730: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
4740: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
4750: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
4760: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
4770: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
4780: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
4790: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
47a0: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
47b0: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
47c0: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
47d0: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
47e0: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
47f0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
4800: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
4810: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
4820: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
4830: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4840: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
4850: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
4860: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
4870: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
4880: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
4890: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
48a0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
48b0: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
48c0: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
48d0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
48e0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
48f0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
4900: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
4910: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
4920: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
4930: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
4940: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
4950: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28  ze - 4);.    if(
4960: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
4970: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
4980: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
4990: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
49a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
49b0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
49c0: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
49d0: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
49e0: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
49f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
4a00: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
4a10: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
4a20: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
4a30: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
4a40: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4a50: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
4a60: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4a70: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
4a80: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
4a90: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
4aa0: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
4ab0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
4ac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
4ad0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
4ae0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
4af0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
4b00: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
4b10: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
4b20: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
4b30: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
4b40: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
4b50: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
4b60: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
4b70: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
4b80: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
4b90: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
4ba0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
4bb0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4bc0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
4bd0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
4be0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
4bf0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
4c00: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
4c10: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
4c20: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
4c30: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
4c40: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
4c50: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
4c60: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
4c70: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
4c80: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
4c90: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4ca0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
4cb0: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
4cc0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
4cd0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4ce0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4cf0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4d00: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
4d10: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
4d20: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
4d30: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
4d40: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4d50: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4d60: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4d70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4d80: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4d90: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4da0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4db0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
4dc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4dd0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
4de0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
4df0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
4e00: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4e10: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4e20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4e30: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4e40: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4e50: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4e60: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4e80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
4e90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4ea0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4eb0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
4ec0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
4ed0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4ee0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4ef0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
4f10: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4f20: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4f30: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4f40: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
4f50: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4f60: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4f70: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
4f80: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
4f90: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
4fa0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
4fb0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
4fc0: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
4fd0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
4fe0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
4ff0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
5000: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5010: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
5020: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
5030: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
5040: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
5050: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
5060: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
5070: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
5080: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
5090: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
50a0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
50b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
50c0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
50d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
50e0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
50f0: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
5100: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5110: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5120: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
5130: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
5140: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
5150: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
5160: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
5170: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
5180: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
5190: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
51a0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
51b0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
51c0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
51d0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
51e0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
51f0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
5200: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
5210: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
5220: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
5230: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
5240: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
5250: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5260: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
5270: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
5280: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
5290: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
52c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
52f0: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
5300: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5320: 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
5330: 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20  byte after cell 
5340: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
5350: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5370: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
5380: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
5390: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
53a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
53b0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
53c0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
53d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
53e0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
53f0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
5400: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
5410: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
5420: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
5430: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
5440: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
5450: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
5460: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
5470: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
5480: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
5490: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
54b0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
54c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
54d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
54e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
54f0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
5500: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
5510: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
5520: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
5530: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
5540: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5550: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5560: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5570: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5580: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
5590: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
55a0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
55b0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
55c0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
55d0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
55e0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
55f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5600: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
5610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
5620: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
5630: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
5640: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
5650: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
5660: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
5670: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
5680: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
5690: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
56a0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
56b0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
56c0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
56d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
56e0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
56f0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
5700: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
5710: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
5720: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
5730: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
5740: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
5750: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
5760: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
5770: 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d  leSize;.  for(i=
5780: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
5790: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
57a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
57b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
57c0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
57d0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
57e0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
57f0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
5800: 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62      if( pc>=usab
5810: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
5820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
5830: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
5840: 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  }.    size = cel
5850: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
5860: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
5870: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
5880: 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f    if( cbrk<cellO
5890: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c  ffset+2*nCell ||
58a0: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
58b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
58c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
58d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
58e0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
58f0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
5900: 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20   && cbrk>=0 );. 
5910: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
5920: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
5930: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
5940: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
5950: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
5960: 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  ( cbrk>=cellOffs
5970: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
5980: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5990: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
59a0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
59b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
59c0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
59d0: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
59e0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
59f0: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
5a00: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72  ta[addr], 0, cbr
5a10: 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72  k-addr);.  asser
5a20: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
5a30: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
5a40: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
5a50: 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70  if( cbrk-addr!=p
5a60: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
5a70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5a90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5aa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5ab0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
5ac0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e  ytes of space on
5ad0: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52   a page..**.** R
5ae0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
5af0: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
5b00: 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74  a[] of the first
5b10: 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
5b20: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
5b30: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
5b40: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
5b50: 65 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73  e is enough.** s
5b60: 70 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74  pace.  This rout
5b70: 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66  ine will never f
5b80: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ail..**.** If th
5b90: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  e page contains 
5ba0: 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73  nBytes of free s
5bb0: 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f  pace but does no
5bc0: 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79  t contain.** nBy
5bd0: 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75  tes of contiguou
5be0: 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68  s free space, th
5bf0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5c00: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a  automatically.**
5c10: 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65   calls defrageme
5c20: 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73  ntPage() to cons
5c30: 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65  olidate all free
5c40: 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a   space before .*
5c50: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  * allocating the
5c60: 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73   new chunk..*/.s
5c70: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
5c80: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
5c90: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
5ca0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
5cb0: 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73  pc, hdr;.  int s
5cc0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67  ize;.  int nFrag
5cd0: 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69  ;.  int top;.  i
5ce0: 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
5cf0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e  cellOffset;.  un
5d00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5d10: 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70  a;.  .  data = p
5d20: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61  Page->aData;.  a
5d30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
5d40: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
5d50: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
5d60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5d70: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
5d80: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5d90: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5da0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
5db0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
5dc0: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
5dd0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
5de0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5df0: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
5e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5e10: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
5e20: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
5e30: 65 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b  e -= (u16)nByte;
5e40: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5e50: 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46  hdrOffset;..  nF
5e60: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
5e70: 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36  ];.  if( nFrag<6
5e80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
5e90: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ch the freelist 
5ea0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
5eb0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
5ec0: 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 20   satisfy the.   
5ed0: 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65 73   ** space reques
5ee0: 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  t. */.    addr =
5ef0: 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c   hdr+1;.    whil
5f00: 65 28 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  e( (pc = get2byt
5f10: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
5f20: 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20  0 ){.      size 
5f30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5f40: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
5f50: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
5f60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
5f70: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
5f90: 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20  <nByte+4 ){.    
5fa0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
5fb0: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
5fc0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
5fd0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
5fe0: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
5ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
6000: 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn pc;.        }
6010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6020: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6030: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
6040: 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20      return pc + 
6050: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
6060: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
6070: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
6080: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
6090: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
60a0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
60b0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
60c0: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
60d0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
60e0: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
60f0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6100: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
6110: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
6120: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
6130: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
6140: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
6150: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
6160: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
6170: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
6180: 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61  yte ){.    defra
6190: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
61a0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
61b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
61c0: 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d  ]);.  }.  top -=
61d0: 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74   nByte;.  assert
61e0: 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ( cellOffset + 2
61f0: 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b  *nCell <= top );
6200: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6210: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
6220: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6230: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6240: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6250: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  ) );.  return to
6260: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6270: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
6280: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
6290: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
62a0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
62b0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
62c0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
62d0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
62e0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
62f0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
6300: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
6310: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
6320: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
6330: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
6340: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
6350: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
6360: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
6370: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
6380: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
6390: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
63a0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
63b0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
63c0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
63d0: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
63e0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
63f0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
6400: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
6410: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
6420: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
6430: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
6440: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
6450: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
6460: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
6470: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
6480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
6490: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
64a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
64b0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
64c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
64d0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
64e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
64f0: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
6500: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
6510: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
6520: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
6530: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
6540: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
6550: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
6560: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
6570: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
6580: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
6590: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
65a0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
65b0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
65c0: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
65d0: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
65e0: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
65f0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
6600: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
6610: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
6620: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
6630: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
6640: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
6650: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6660: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
6670: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
6680: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
6690: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
66a0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
66b0: 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64   if( pbegin<=add
66c0: 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  r ) {.      retu
66d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
66e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
66f0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6700: 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67  .  }.  if ( pbeg
6710: 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  in>pPage->pBt->u
6720: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a  sableSize-4 ) {.
6730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6740: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6750: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
6760: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
6770: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
6780: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6790: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
67a0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
67b0: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
67c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
67d0: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
67e0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
67f0: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
6800: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
6810: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
6820: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
6830: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
6840: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
6850: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6860: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
6870: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
6880: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
6890: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
68a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
68b0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
68c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
68d0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
68e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
68f0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
6900: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
6910: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
6920: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
6930: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
6940: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
6950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
6960: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
6970: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
6980: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
6990: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
69a0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
69b0: 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t+7]) ){.       
69c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
69d0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
69e0: 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b     }.      data[
69f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6a00: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
6a10: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
6a20: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
6a30: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
6a40: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
6a50: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
6a60: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
6a70: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
6a80: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
6a90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6aa0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
6ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6ac0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6ad0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6ae0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6af0: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
6b00: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
6b10: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
6b20: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
6b30: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
6b40: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
6b50: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
6b60: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
6b70: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6b80: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
6b90: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
6ba0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
6bb0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
6bc0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6bd0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
6be0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6bf0: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
6c00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6c10: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
6c20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6c30: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6c40: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6c50: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6c60: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
6c70: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
6c80: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
6c90: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
6ca0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
6cb0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
6cc0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
6cd0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
6ce0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
6cf0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
6d00: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
6d10: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
6d20: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
6d30: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
6d40: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
6d50: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
6d60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6d70: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
6d80: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
6d90: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
6da0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
6db0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
6dc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6dd0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6de0: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
6df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6e00: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
6e10: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
6e20: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
6e30: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
6e40: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
6e50: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
6e60: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
6e70: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
6e80: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
6e90: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6ea0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6eb0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6ec0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
6ed0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
6ee0: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
6ef0: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
6f00: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
6f10: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
6f20: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
6f30: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
6f40: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
6f50: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
6f60: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
6f70: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
6f80: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
6f90: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
6fa0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
6fb0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
6fc0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
6fd0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
6fe0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
6ff0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
7000: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
7010: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
7020: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
7030: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
7040: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
7050: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
7060: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
7070: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
7080: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
7090: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
70a0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
70b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
70c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
70d0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
70e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
70f0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7100: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
7110: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
7120: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
7130: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
7140: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
7150: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
7160: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
7170: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
7180: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
7190: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
71a0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
71b0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
71c0: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
71d0: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
71e0: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
71f0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
7200: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
7210: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
7220: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
7230: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
7240: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
7250: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
7260: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
7270: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
7280: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
7290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
72a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
72b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
72c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
72d0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
72e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
72f0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
7300: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7310: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
7320: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7330: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7350: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
7360: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7370: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7380: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
7390: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
73a0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
73b0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
73c0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
73d0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
73e0: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
73f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
7400: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
7410: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
7420: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
7430: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
7440: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
7450: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
7460: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
7470: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
7480: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
7490: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
74a0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
74b0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
74c0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
74d0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
74e0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
74f0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
7500: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
7510: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
7520: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
7530: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7540: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7550: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
7560: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
7570: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
7580: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
7590: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
75a0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
75b0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
75c0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
75d0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
75e0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
75f0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
7600: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
7610: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
7620: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7630: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
7640: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
7650: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
7660: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
7670: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
7680: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
7690: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
76a0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
76b0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
76c0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
76d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
76e0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
76f0: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
7700: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
7710: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
7720: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7730: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
7740: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
7750: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
7760: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
7770: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
7780: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
7790: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
77a0: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
77b0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
77c0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
77d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
77e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
77f0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }.  .    /* Comp
7800: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
7810: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
7820: 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d  page */.    pc =
7830: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7840: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
7850: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
7860: 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66   + top - (cellOf
7870: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
7880: 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c  nCell);.    whil
7890: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
78a0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
78b0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
78c0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
78d0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
78e0: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
78f0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
7900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7910: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
7920: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
7930: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7940: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
7950: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7960: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
7970: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
7980: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
7990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
79a0: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
79b0: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
79c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  er */.        re
79d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
79e0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
79f0: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b   }.      nFree +
7a00: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  = size;.      pc
7a10: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
7a20: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
7a30: 3d 20 28 75 31 36 29 6e 46 72 65 65 3b 0a 20 20  = (u16)nFree;.  
7a40: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
7a50: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
7a60: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7a70: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7a80: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
7a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7ab0: 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a  ; .    }..#if 0.
7ac0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
7ad0: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
7ae0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
7af0: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
7b00: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
7b10: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
7b20: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
7b30: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
7b40: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
7b50: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
7b60: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
7b70: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
7b80: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
7b90: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
7ba0: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
7bb0: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
7bc0: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
7bd0: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
7be0: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
7bf0: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
7c00: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
7c10: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
7c20: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
7c30: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
7c40: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
7c50: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
7c60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
7c70: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
7c80: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
7c90: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
7ca0: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
7cb0: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
7cc0: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
7cd0: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
7ce0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
7cf0: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
7d00: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
7d10: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
7d20: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
7d30: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
7d40: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
7d50: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
7d60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7d70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7d80: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7d90: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
7da0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
7db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7dd0: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7de0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7df0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7e00: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7e10: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7e20: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7e30: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7e40: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7e50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7e60: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7e70: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7e80: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7e90: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
7ea0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
7eb0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
7ec0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7ed0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
7ee0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
7ef0: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
7f00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7f10: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
7f20: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
7f30: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
7f40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7f50: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
7f60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7f70: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
7f80: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7f90: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7fa0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7fc0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7fd0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d  utex) );.  /*mem
7fe0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
7ff0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
8000: 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64  ze - hdr);*/.  d
8010: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
8020: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
8030: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
8040: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
8050: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
8060: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
8070: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
8080: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
8090: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
80a0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
80b0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
80c0: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
80d0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
80e0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
80f0: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
8100: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
8110: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
8120: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
8130: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
8140: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
8150: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
8160: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
8170: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
8180: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
8190: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
81a0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
81b0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
81c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
81d0: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
81e0: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
81f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
8200: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
8210: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
8220: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
8230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
8240: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
8250: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
8260: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
8270: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
8280: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
8290: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
82a0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
82b0: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
82c0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
82d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
82e0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
82f0: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
8300: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
8310: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
8320: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
8330: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
8340: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
8350: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
8360: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
8370: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
8380: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
8390: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
83a0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
83b0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
83c0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
83d0: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
83e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
83f0: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
8400: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
8410: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
8420: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
8430: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
8440: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
8450: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
8460: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
8470: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
8480: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
8490: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
84a0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
84b0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
84c0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
84d0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
84e0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
84f0: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
8500: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
8510: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
8520: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
8530: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
8540: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
8550: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
8560: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
8570: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
8580: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
8590: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
85a0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
85b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
85c0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
85d0: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
85e0: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
85f0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
8600: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
8610: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
8620: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
8630: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
8640: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
8650: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8660: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8670: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
8680: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8690: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
86a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
86b0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
86c0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
86d0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
86e0: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
86f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8700: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
8710: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
8720: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
8730: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
8740: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8750: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8760: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
8770: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
8780: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
8790: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
87a0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
87b0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
87c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
87d0: 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o pagerPagecount
87e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
87f0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d  .  int nPage = -
8800: 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
8810: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
8820: 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  e1 );.  rc = sql
8830: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
8840: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
8850: 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  &nPage);.  asser
8860: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8870: 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b   || nPage==-1 );
8880: 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29  .  return (Pgno)
8890: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
88a0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
88b0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
88c0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
88d0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
88e0: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
88f0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
8900: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
8910: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
8920: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
8930: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
8940: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
8950: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
8960: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
8970: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
8980: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
8990: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
89a0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
89b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
89c0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
89d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
89e0: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
89f0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
8a00: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
8a10: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
8a20: 2a 70 44 62 50 61 67 65 3b 0a 20 20 4d 65 6d 50  *pDbPage;.  MemP
8a30: 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
8a40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8a50: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8a60: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
8a70: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
8a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8a90: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
8aa0: 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e    /* It is often
8ab0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
8ac0: 68 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20  he page we want 
8ad0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  is already in ca
8ae0: 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c  che..  ** If so,
8af0: 20 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79   get it directly
8b00: 2e 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73  .  This saves us
8b10: 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20   from having to 
8b20: 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50  call.  ** pagerP
8b30: 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61  agecount() to ma
8b40: 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20  ke sure pgno is 
8b50: 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77  within limits, w
8b60: 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a  hich results.  *
8b70: 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62  * in a measureab
8b80: 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  le performance i
8b90: 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a  mprovements..  *
8ba0: 2f 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  /.  pDbPage = sq
8bb0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
8bc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
8bd0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
8be0: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
8bf0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
8c00: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 2a 70 70  cache */.    *pp
8c10: 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62  Page = pPage = b
8c20: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
8c30: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
8c40: 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  , pBt);.    rc =
8c50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8c60: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65  lse{.    /* Page
8c70: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20   not in cache.  
8c80: 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20  Acquire it. */. 
8c90: 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65     if( pgno>page
8ca0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
8cb0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8cd0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
8ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
8cf0: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
8d00: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
8d10: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
8d20: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
8d30: 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d  e = *ppPage;.  }
8d40: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
8d50: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20  sInit ){.    rc 
8d60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
8d70: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
8d80: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
8d90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
8da0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
8db0: 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  ;.    *ppPage = 
8dc0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8dd0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
8de0: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
8df0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
8e00: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
8e10: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
8e20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
8e30: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
8e40: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
8e50: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
8e60: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
8e70: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
8e80: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
8e90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8ea0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
8eb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8ec0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8ed0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
8ee0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
8ef0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8f00: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
8f10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
8f20: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
8f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8f40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8f50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8f60: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
8f70: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
8f80: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
8f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
8fa0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
8fb0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
8fc0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
8fd0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
8fe0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
8ff0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
9000: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
9010: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
9020: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
9030: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
9040: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
9050: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9060: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
9070: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
9080: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
9090: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
90a0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
90b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
90c0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
90d0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
90e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
90f0: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
9100: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
9110: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
9120: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
9130: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
9140: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
9150: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
9160: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9180: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9190: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
91a0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
91b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
91c0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
91d0: 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20 20 20  Data)>0 ){.     
91e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
91f0: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9200: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9210: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
9220: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
9230: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
9240: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
9250: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
9260: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
9270: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
9280: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
9290: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
92a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
92b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
92c0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
92d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
92e0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
92f0: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
9300: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
9310: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
9320: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
9330: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
9340: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
9350: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
9360: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
9370: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
9380: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
9390: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
93a0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
93b0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
93c0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
93d0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
93e0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
93f0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
9400: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9410: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
9420: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9430: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
9440: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
9450: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
9460: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
9470: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
9480: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
9490: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
94a0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
94b0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
94c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
94d0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
94e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
94f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
9500: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
9510: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
9520: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
9530: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9540: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
9550: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
9560: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9580: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
9590: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
95a0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
95b0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
95c0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
95d0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
95e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
95f0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
9600: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
9610: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
9620: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
9630: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
9640: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
9650: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
9660: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9670: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
9680: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
9690: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
96a0: 75 38 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  u8 nReserve;.  u
96b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
96c0: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  Header[100];..  
96d0: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
96e0: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
96f0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
9700: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
9710: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
9720: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
9730: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
9740: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
9750: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
9760: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
9770: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
9780: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
9790: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
97a0: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
97b0: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
97c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
97d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
97e0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
97f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9800: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
9810: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9820: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
9830: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
9840: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
9850: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
9860: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
9870: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
9880: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
9890: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
98a0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
98b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
98c0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
98d0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
98e0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
98f0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9900: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
9910: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
9920: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9930: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9940: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
9950: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
9960: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
9970: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9980: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9990: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
99a0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
99b0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
99c0: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
99d0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
99e0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
99f0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
9a00: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
9a10: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
9a20: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
9a30: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
9a40: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
9a50: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
9a60: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
9a70: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
9a80: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
9a90: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
9aa0: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
9ab0: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
9ac0: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
9ad0: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
9ae0: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
9af0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
9b00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
9b10: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
9b20: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9b30: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
9b40: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
9b50: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
9b60: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
9b70: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
9b80: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
9b90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
9ba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9bb0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
9bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9bd0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
9be0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
9bf0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
9c00: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
9c10: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
9c20: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
9c30: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
9c40: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9c50: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9c60: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
9c70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9c80: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
9c90: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
9ca0: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
9cb0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
9cc0: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
9cd0: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
9ce0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9cf0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
9d00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
9d10: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
9d20: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
9d30: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
9d40: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
9d50: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
9d60: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
9d70: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
9d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
9d90: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
9da0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
9db0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
9dc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9de0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9df0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
9e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9e10: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
9e20: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
9e30: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
9e40: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
9e50: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
9e60: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
9e70: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
9e80: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
9e90: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
9ea0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
9eb0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
9ec0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
9ed0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
9ee0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
9ef0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
9f00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
9f10: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
9f20: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
9f30: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
9f40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
9f50: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
9f60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
9f70: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
9f80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
9f90: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
9fa0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
9fb0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
9fc0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
9fd0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
9fe0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
9ff0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
a000: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
a010: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
a020: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
a030: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
a040: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
a050: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
a060: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a070: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
a080: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
a090: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a0a0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
a0b0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a0d0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
a0e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
a0f0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
a100: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
a110: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
a120: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
a130: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
a140: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
a150: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
a160: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a170: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
a180: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a190: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a1a0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
a1b0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
a1c0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
a1f0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
a200: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
a210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a220: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a230: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
a240: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
a250: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
a260: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
a270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a280: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a290: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
a2a0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
a2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
a2c0: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
a2d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
a2e0: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
a2f0: 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
a300: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
a310: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
a320: 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d  SetReiniter(pBt-
a330: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69  >pPager, pageRei
a340: 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  nit);.    pBt->p
a350: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
a360: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
a370: 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  .    pBt->readOn
a380: 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ly = sqlite3Page
a390: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
a3a0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
a3b0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65  t->pageSize = ge
a3c0: 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t2byte(&zDbHeade
a3d0: 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  r[16]);.    if( 
a3e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
a3f0: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
a400: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
a410: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
a420: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
a430: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
a440: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
a450: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
a460: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
a470: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
a480: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
a490: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
a4a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a4b0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
a4c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a4d0: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
a4e0: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
a4f0: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
a500: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
a510: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
a520: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
a530: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
a540: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
a550: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
a560: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
a570: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
a580: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
a590: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
a5a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
a5b0: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
a5c0: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
a5d0: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
a5e0: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
a5f0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
a600: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
a610: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
a620: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
a630: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
a640: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
a650: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
a660: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
a670: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
a680: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a690: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
a6a0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
a6b0: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
a6c0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
a6d0: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
a6e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a6f0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
a700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a710: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
a720: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
a730: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
a740: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
a750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a760: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
a770: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
a780: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
a790: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
a7a0: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
a7b0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
a7c0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
a7d0: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
a7e0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
a7f0: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
a800: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
a810: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
a820: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
a830: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
a840: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
a850: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
a860: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ageSize */.    s
a870: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a880: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
a890: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
a8a0: 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65  ze);.   .#if !de
a8b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a8c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a8d0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a8e0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a8f0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
a900: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
a910: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
a920: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
a930: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
a940: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
a950: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
a960: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
a970: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
a980: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
a990: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
a9a0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a9b0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a9c0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
a9e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
a9f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
aa00: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
aa10: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
aa20: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
aa30: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
aa40: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
aa50: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
aa60: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
aa70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
aa80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
aa90: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
aaa0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
aab0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
aac0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
aad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
aae0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
aaf0: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
ab00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
ab10: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
ab20: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ab30: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
ab40: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
ab50: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ab60: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
ab70: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
ab80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
ab90: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
aba0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
abb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
abc0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
abd0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
abe0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
abf0: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
ac00: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
ac10: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
ac20: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
ac30: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
ac40: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
ac50: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
ac60: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
ac70: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
ac80: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
ac90: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
aca0: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
acb0: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
acc0: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
acd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ace0: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
acf0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ad00: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ad10: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
ad20: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
ad30: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
ad40: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
ad50: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
ad60: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
ad70: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
ad80: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
ad90: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
ada0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
adb0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
adc0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
add0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ade0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
adf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae00: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
ae10: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
ae20: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
ae30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ae40: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
ae50: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
ae60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
ae70: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
ae80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
ae90: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
aea0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
aeb0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
aec0: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
aed0: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
aee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
aef0: 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
af00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
af20: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
af30: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
af40: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
af50: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
af60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
af70: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
af80: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
af90: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
afa0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
afb0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
afc0: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
afd0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
afe0: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
aff0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
b010: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
b020: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
b030: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
b040: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
b050: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
b060: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
b070: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
b080: 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
b090: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
b0a0: 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
b0b0: 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
b0c0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
b0d0: 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
b0e0: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
b0f0: 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
b100: 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
b110: 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
b120: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
b130: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
b140: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
b150: 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
b160: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
b170: 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
b180: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b190: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
b1a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
b1b0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
b1c0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
b1d0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
b1e0: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
b1f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
b200: 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
b210: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
b220: 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
b230: 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
b240: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
b250: 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
b260: 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
b270: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
b280: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
b290: 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
b2a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b2b0: 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
b2c0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
b2d0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
b2e0: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
b2f0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
b300: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
b310: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
b320: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
b330: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
b340: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
b350: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
b360: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
b370: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
b380: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
b390: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
b3a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b3b0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
b3c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
b3d0: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
b3e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
b3f0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
b400: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
b410: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
b420: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
b430: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
b440: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
b450: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
b460: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
b470: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
b480: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
b490: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
b4a0: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
b4b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
b4c0: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
b4d0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
b4e0: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
b4f0: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
b500: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
b510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
b520: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
b530: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
b540: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
b550: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
b560: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
b570: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
b580: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
b590: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
b5a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
b5b0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
b5c0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
b5d0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
b5e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b5f0: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
b600: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
b610: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
b620: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
b630: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
b640: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
b650: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
b660: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
b670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b680: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
b690: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
b6a0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
b6b0: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70  >db = p->db;.  p
b6c0: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
b6d0: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
b6e0: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
b6f0: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
b700: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
b710: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
b720: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
b730: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b740: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
b750: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
b760: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
b770: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
b780: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
b790: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
b7a0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
b7b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
b7c0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
b7d0: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
b7e0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
b7f0: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
b800: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
b810: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
b820: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b830: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
b840: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
b850: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
b860: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
b870: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
b880: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
b890: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
b8a0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
b8b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
b8c0: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
b8d0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
b8e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b8f0: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
b900: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
b910: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
b920: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
b930: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
b940: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
b950: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
b960: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
b970: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
b980: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
b990: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
b9a0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
b9b0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
b9c0: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
b9d0: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
b9e0: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
b9f0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
ba00: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
ba10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ba20: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
ba30: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
ba40: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
ba50: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
ba60: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
ba70: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
ba80: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
ba90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
baa0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
bab0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
bac0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
bad0: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
bae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
baf0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
bb00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
bb10: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
bb20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
bb30: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
bb40: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
bb50: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
bb60: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
bb70: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
bb80: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
bb90: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
bba0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
bbb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bbc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
bbd0: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
bbe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
bbf0: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
bc00: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
bc10: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
bc20: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
bc30: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
bc40: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
bc50: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
bc60: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
bc70: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
bc80: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
bc90: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
bca0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
bcb0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
bcc0: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
bcd0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
bce0: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
bcf0: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
bd00: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
bd10: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
bd20: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
bd30: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
bd40: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
bd50: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
bd60: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
bd70: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
bd80: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
bd90: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
bda0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
bdb0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
bdc0: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
bdd0: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
bde0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
bdf0: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
be00: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
be10: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
be20: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
be30: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
be40: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
be50: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
be60: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
be70: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
be80: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
be90: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
bea0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
beb0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
bec0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
bed0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bee0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
bef0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
bf00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
bf10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
bf20: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
bf30: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
bf40: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
bf50: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
bf60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bf70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
bf80: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
bf90: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
bfa0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
bfb0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
bfc0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
bfd0: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
bfe0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
bff0: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
c000: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
c010: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
c020: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
c030: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
c040: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
c050: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
c060: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
c070: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
c080: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
c090: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
c0a0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
c0b0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
c0c0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
c0d0: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
c0e0: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
c0f0: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
c100: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
c110: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
c120: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
c130: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c140: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
c150: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
c160: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
c170: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
c180: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
c190: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
c1a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c1b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c1c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
c1d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
c1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c1f0: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
c200: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
c210: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
c220: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
c230: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c240: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c250: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c260: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
c270: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
c280: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
c290: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
c2a0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
c2b0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
c2c0: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
c2d0: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
c2e0: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
c2f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
c300: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
c310: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
c320: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c330: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
c340: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c350: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
c360: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
c370: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c380: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
c390: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
c3a0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
c3b0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
c3c0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
c3d0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c3e0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c3f0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
c400: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
c410: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
c420: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c430: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
c440: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
c450: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
c460: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
c470: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
c480: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
c490: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
c4a0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
c4b0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
c4c0: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
c4d0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
c4e0: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
c4f0: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
c500: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
c510: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
c520: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
c530: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
c540: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
c550: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
c560: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
c570: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
c580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
c590: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
c5a0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
c5b0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
c5c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
c5d0: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
c5e0: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
c5f0: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
c600: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
c610: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
c620: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
c630: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
c640: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
c650: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
c660: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
c670: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
c680: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
c690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c6a0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
c6b0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
c6c0: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
c6d0: 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
c6e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
c6f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
c700: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
c710: 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
c720: 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
c730: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c740: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c750: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c760: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
c770: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c780: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c790: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
c7a0: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
c7b0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
c7c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c7d0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c7e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
c7f0: 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
c800: 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
c810: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
c820: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
c830: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
c840: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
c850: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
c860: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
c870: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
c880: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
c890: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
c8a0: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
c8b0: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
c8c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
c8d0: 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
c8e0: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
c8f0: 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
c900: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
c910: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
c920: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
c930: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
c940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
c950: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
c960: 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
c970: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c980: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
c9a0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
c9b0: 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
c9c0: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
c9d0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
c9e0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
c9f0: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
ca00: 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71  geSize;.}.int sq
ca10: 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
ca20: 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
ca30: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
ca40: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
ca50: 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
ca60: 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
ca70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
ca80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
ca90: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
caa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
cab0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
cac0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
cad0: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
cae0: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
caf0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
cb00: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
cb10: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
cb20: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
cb30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
cb40: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
cb50: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
cb60: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
cb70: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
cb80: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
cb90: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
cba0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
cbb0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
cbc0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
cbd0: 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
cbe0: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
cbf0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
cc00: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
cc10: 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66  turn n;.}.#endif
cc20: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
cc30: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
cc40: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
cc50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cc60: 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
cc70: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
cc80: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
cc90: 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
cca0: 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
ccb0: 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
ccc0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
ccd0: 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
cce0: 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
ccf0: 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
cd00: 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
cd10: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
cd20: 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
cd30: 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
cd40: 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
cd50: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
cd60: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
cd70: 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
cd80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
cd90: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
cda0: 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
cdb0: 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
cdc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
cdd0: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
cde0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
cdf0: 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
ce00: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
ce10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ce20: 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 61 75  OK;.  u8 av = au
ce30: 74 6f 56 61 63 75 75 6d 20 3f 31 3a 30 3b 0a 0a  toVacuum ?1:0;..
ce40: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ce50: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
ce60: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
ce70: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
ce80: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
ce90: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
cea0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
ceb0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
cec0: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
ced0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
cee0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
cef0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cf00: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
cf10: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
cf20: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
cf30: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
cf40: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
cf50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
cf60: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
cf70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
cf80: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
cf90: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
cfa0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cfb0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
cfc0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
cfd0: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
cfe0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
cff0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
d000: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
d010: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
d020: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
d030: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
d040: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
d050: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
d060: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
d070: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
d080: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
d090: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
d0a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
d0b0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
d0c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
d0d0: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
d0e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
d0f0: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
d100: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
d110: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
d120: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
d130: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
d140: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
d150: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
d160: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
d170: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
d180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d190: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
d1a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
d1b0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
d1c0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
d1d0: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
d1e0: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
d1f0: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
d200: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
d210: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
d220: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
d230: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
d240: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
d250: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
d260: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d270: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d280: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
d290: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
d2a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d2b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
d2c0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
d2d0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
d2e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d2f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d300: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
d310: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
d320: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
d330: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
d340: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
d350: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d360: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
d370: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
d380: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
d390: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
d3a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d3b0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d3c0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
d3d0: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
d3e0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
d3f0: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
d400: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
d410: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
d420: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
d430: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
d440: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
d450: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
d460: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
d470: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d480: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d490: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
d4a0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
d4b0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
d4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d4d0: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
d4e0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
d4f0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
d500: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
d510: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
d520: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
d530: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
d540: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
d550: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
d560: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
d570: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
d580: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
d590: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
d5a0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
d5b0: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
d5c0: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
d5d0: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
d5e0: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
d5f0: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
d600: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
d610: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
d620: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
d630: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
d640: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
d650: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d660: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d670: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
d680: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
d690: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
d6a0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
d6b0: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
d6c0: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
d6d0: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
d6e0: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
d6f0: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
d700: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
d710: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
d720: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d730: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d740: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
d750: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
d760: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d770: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
d780: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
d790: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
d7a0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
d7b0: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
d7c0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d7d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
d7e0: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
d7f0: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
d800: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
d810: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
d820: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
d830: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
d840: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
d850: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
d860: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
d870: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
d880: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
d890: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d8a0: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
d8b0: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
d8c0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
d8d0: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
d8e0: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
d8f0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
d900: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d910: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
d920: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
d930: 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
d940: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
d950: 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
d960: 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
d970: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
d980: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
d990: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
d9a0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
d9b0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
d9c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d9d0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
d9e0: 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20   usableSize<500 
d9f0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
da00: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
da10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
da20: 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
da30: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
da40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
da50: 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
da60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
da70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
da80: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
da90: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
daa0: 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
dab0: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
dac0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
dad0: 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
dae0: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
daf0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
db00: 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
db10: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
db20: 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
db30: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
db40: 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
db50: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
db60: 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
db70: 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
db80: 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
db90: 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
dba0: 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
dbb0: 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
dbc0: 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
dbd0: 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
dbe0: 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
dbf0: 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
dc00: 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
dc10: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
dc20: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
dc30: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
dc40: 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
dc50: 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
dc60: 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
dc70: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
dc80: 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
dc90: 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
dca0: 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
dcb0: 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
dcc0: 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
dcd0: 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
dce0: 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
dcf0: 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
dd00: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
dd10: 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
dd20: 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
dd30: 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
dd40: 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
dd50: 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
dd60: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
dd70: 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
dd80: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
dd90: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
dda0: 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
ddb0: 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
ddc0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
ddd0: 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
dde0: 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
ddf0: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
de00: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
de10: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
de20: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
de30: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
de40: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
de50: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
de60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
de70: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
de80: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
de90: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
dea0: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
deb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
dec0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
ded0: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
dee0: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
def0: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
df00: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
df10: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
df20: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
df30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
df40: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
df50: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
df60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
df70: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
df80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
df90: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
dfa0: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
dfb0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
dfc0: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
dfd0: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
dfe0: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
dff0: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
e000: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
e010: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
e020: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
e030: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
e040: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
e050: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
e060: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
e070: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
e080: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
e090: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e0a0: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
e0b0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
e0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
e0d0: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
e0e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e0f0: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
e100: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
e110: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
e120: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
e130: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
e140: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
e150: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
e160: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
e170: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
e180: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
e190: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
e1a0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
e1b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e1c0: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
e1d0: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
e1e0: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
e1f0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
e200: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
e210: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
e220: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
e230: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
e240: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
e250: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
e260: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
e270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
e280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e290: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
e2a0: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
e2b0: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
e2c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e2d0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
e2e0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
e2f0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
e300: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
e310: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
e320: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
e330: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
e340: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
e350: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
e360: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
e370: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
e380: 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66  ;.#if 0.      if
e390: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
e3a0: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
e3b0: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
e3c0: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
e3d0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
e3e0: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
e3f0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
e400: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
e410: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20       pPage->pBt 
e420: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
e430: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  Page->pgno = 1;.
e440: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
e450: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
e460: 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
e470: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50     }.    pBt->pP
e480: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
e490: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
e4a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
e4b0: 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
e4c0: 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
e4d0: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
e4e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
e4f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
e500: 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
e510: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
e520: 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
e530: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e540: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
e550: 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
e560: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e570: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
e580: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
e590: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
e5a0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
e5b0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
e5c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
e5d0: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
e5e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
e5f0: 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
e600: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
e610: 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
e620: 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
e630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
e640: 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
e650: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
e660: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
e670: 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
e680: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
e690: 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
e6a0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
e6b0: 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
e6c0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
e6d0: 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
e6e0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
e6f0: 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
e700: 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
e710: 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
e720: 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
e730: 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
e740: 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
e750: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
e760: 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
e770: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
e780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
e790: 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
e7a0: 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
e7b0: 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
e7c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e7d0: 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
e7e0: 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
e7f0: 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
e800: 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
e810: 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
e820: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
e830: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e840: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e850: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
e860: 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
e870: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
e880: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e890: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
e8a0: 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
e8b0: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
e8c0: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
e8d0: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
e8e0: 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
e8f0: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
e900: 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
e910: 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
e920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
e940: 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
e950: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
e960: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e970: 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
e980: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
e990: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
e9a0: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
e9b0: 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
e9c0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
e9d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e9e0: 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
e9f0: 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
ea00: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
ea10: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
ea20: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
ea30: 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
ea40: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
ea50: 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
ea60: 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
ea70: 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
ea80: 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
ea90: 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
eaa0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
eab0: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
eac0: 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
ead0: 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
eae0: 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
eaf0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
eb00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
eb10: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
eb20: 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
eb30: 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
eb40: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
eb50: 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
eb60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
eb70: 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
eb80: 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
eb90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
eba0: 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
ebb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
ebc0: 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
ebd0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ebe0: 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
ebf0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
ec00: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
ec10: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ec20: 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
ec30: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ec40: 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
ec50: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ec60: 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
ec70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
ec80: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
ec90: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
eca0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
ecb0: 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
ecc0: 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
ecd0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
ece0: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
ecf0: 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
ed00: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
ed10: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
ed20: 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
ed30: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
ed40: 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
ed50: 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
ed60: 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
ed70: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
ed80: 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
ed90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
eda0: 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
edb0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
edc0: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
edd0: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
ede0: 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
edf0: 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
ee00: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
ee10: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
ee20: 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
ee30: 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
ee40: 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
ee50: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
ee60: 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
ee70: 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
ee80: 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
ee90: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
eea0: 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
eeb0: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
eec0: 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
eed0: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
eee0: 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
eef0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
ef00: 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
ef10: 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
ef20: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
ef30: 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
ef40: 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
ef50: 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
ef60: 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
ef70: 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
ef80: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
ef90: 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
efa0: 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
efb0: 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
efc0: 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
efd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
efe0: 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
eff0: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
f000: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f010: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
f020: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
f030: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
f040: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
f050: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72  b = p->db;.  btr
f060: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
f070: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
f080: 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
f090: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
f0a0: 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
f0b0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
f0c0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
f0d0: 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
f0e0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
f0f0: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
f100: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
f110: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
f120: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
f130: 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
f140: 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
f150: 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
f160: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
f170: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
f180: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
f190: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
f1a0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
f1b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
f1c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
f1d0: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
f1e0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
f1f0: 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
f200: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
f210: 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
f220: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
f230: 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
f240: 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
f250: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
f260: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
f270: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
f280: 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
f290: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
f2a0: 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
f2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
f2c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
f2d0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
f2e0: 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77  TRANS_WRITE && w
f2f0: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
f300: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
f310: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
f320: 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
f330: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f340: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
f350: 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
f360: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
f370: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
f380: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
f390: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
f3a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
f3b0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f3d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f3e0: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
f3f0: 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a  _begun;.      }.
f400: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f410: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
f420: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
f430: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
f440: 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
f450: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
f460: 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
f470: 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
f480: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
f490: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f4a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
f4b0: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
f4c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
f4d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f4e0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f4f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f500: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f510: 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
f520: 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20  Page1->pDbPage, 
f530: 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20  wrflag>1);.     
f540: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f550: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f560: 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
f570: 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
f580: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f590: 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
f5a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f5b0: 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20     if( wrflag ) 
f5c0: 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
f5d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f5e0: 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
f5f0: 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
f600: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
f610: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
f620: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f630: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
f640: 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
f650: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
f660: 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
f670: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f680: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
f690: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
f6a0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
f6b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20  Transaction++;. 
f6c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
f6d0: 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
f6e0: 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
f6f0: 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
f700: 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
f710: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
f720: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
f730: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
f740: 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66  Trans;.    }.#if
f750: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f760: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f770: 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
f780: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
f790: 21 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65  !pBt->pExclusive
f7a0: 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
f7b0: 45 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20  Exclusive = p;. 
f7c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f7d0: 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
f7e0: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
f7f0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
f800: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f810: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
f820: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f830: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
f840: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
f850: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
f860: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
f870: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
f880: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
f890: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
f8a0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
f8b0: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
f8c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
f8d0: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
f8e0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
f8f0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
f900: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
f910: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
f920: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
f930: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
f960: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
f970: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
f980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f990: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
f9a0: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
f9b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f9e0: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
f9f0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
fa00: 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
fa10: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
fa20: 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
fa30: 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
fa40: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
fa50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fa60: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fa70: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
fa80: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
fa90: 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
faa0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fab0: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
fac0: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
fad0: 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
fae0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
faf0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
fb00: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
fb10: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
fb20: 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
fb30: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
fb40: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
fb50: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ll);.    if( rc!
fb60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fb70: 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
fb80: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
fb90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
fba0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
fbb0: 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
fbc0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
fbd0: 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20  Cell);.      rc 
fbe0: 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
fbf0: 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
fc00: 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
fc10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fc20: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
fc30: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
fc40: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
fc50: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
fc60: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
fc70: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
fc80: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
fc90: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
fca0: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
fcb0: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
fcc0: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
fcd0: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
fce0: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
fcf0: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
fd00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fd10: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
fd20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fd30: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
fd40: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
fd50: 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
fd60: 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
fd70: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
fd80: 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
fd90: 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
fda0: 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
fdb0: 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
fdc0: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
fdd0: 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
fde0: 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
fdf0: 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
fe00: 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
fe10: 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
fe20: 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
fe30: 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
fe40: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
fe50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
fe60: 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
fe70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fe80: 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
fe90: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
fea0: 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
feb0: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
fec0: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
fed0: 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
fee0: 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
fef0: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
ff00: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
ff10: 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
ff20: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
ff30: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
ff40: 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
ff50: 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
ff60: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
ff70: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ff90: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
ffa0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
ffb0: 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
ffc0: 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
ffd0: 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
ffe0: 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
fff0: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
10000 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10010 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
10020 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10030 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10040 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
10050 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10060 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
10070 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
10080 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
10090 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
100a0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
100b0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
100c0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
100d0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
100e0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
100f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10120 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
10130 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
10140 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10150 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
10160 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
10170 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
10180 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71  t nCell;..    sq
10190 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
101a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e  ge(pPage);.    n
101b0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
101c0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
101d0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
101e0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
101f0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
10200 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
10210 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
10220 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
10230 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
10240 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  fo;.        sqli
10250 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
10260 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
10270 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
10280 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
10290 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
102a0 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
102b0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
102c0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
102d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
102e0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
102f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
10300 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
10310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10320 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
10330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10340 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
10350 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
10360 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
10370 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
10380 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
103a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
103b0 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
103c0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
103d0 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
103e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
103f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
10400 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
10410 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
10420 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10430 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10440 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
10450 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
10460 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
10470 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
10480 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
10490 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
104a0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
104b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
104c0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
104d0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
104e0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
104f0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
10500 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
10510 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
10520 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
10530 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
10540 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
10550 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
10560 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
10570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
10580 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
10590 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
105a0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
105b0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
105c0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
105d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
105e0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
105f0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
10600 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
10610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10620 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
10630 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
10640 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
10650 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
10660 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
10670 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
10680 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
10690 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65  isCommit.){.  Me
106a0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
106b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
106c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
106d0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
106e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
106f0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
10700 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
10710 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
10720 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
10730 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
10740 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
10750 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
10760 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
10770 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
10780 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
10790 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
107a0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
107b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
107c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
107d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
107e0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
107f0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
10800 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
10810 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
10820 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
10830 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
10840 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
10850 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
10860 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
10870 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
10880 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
10890 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
108a0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
108b0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
108c0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
108d0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
108e0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
108f0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
10900 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
10910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10920 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10930 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
10940 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
10950 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
10960 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
10970 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
10980 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
10990 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
109a0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
109b0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
109c0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
109d0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
109e0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
109f0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
10a00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
10a10 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
10a20 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
10a30 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
10a40 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
10a50 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
10a60 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
10a70 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
10a80 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
10a90 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
10aa0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
10ab0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
10ac0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
10ad0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
10ae0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
10af0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
10b00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
10b10 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
10b20 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
10b30 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
10b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10b50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10b60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
10b70 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
10b80 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
10b90 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
10ba0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
10bb0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
10bc0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
10bd0 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
10be0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
10bf0 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20   iFreePage);.   
10c00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10c20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10c30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10c40 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
10c50 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
10c60 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
10c70 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
10c80 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
10c90 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
10ca0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
10cb0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
10cc0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
10cd0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
10ce0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
10cf0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
10d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10d10 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
10d20 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
10d30 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
10d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10d60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10d70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10d80 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
10d90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
10da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10db0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
10dc0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
10dd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
10df0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
10e00 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
10e10 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
10e20 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
10e30 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
10e40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
10e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10e60 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
10e70 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
10e80 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
10e90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
10ea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10eb0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
10ec0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
10ed0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
10ee0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
10ef0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
10f00 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
10f10 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
10f20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
10f30 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
10f40 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
10f50 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
10f60 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
10f70 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51  ul,.** return SQ
10f80 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
10f90 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
10fa0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
10fb0 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e  e no.** point in
10fc0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
10fd0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
10fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10ff0 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  E..**.** More sp
11000 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66  ecificly, this f
11010 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
11020 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
11030 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
11040 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73   so that the las
11050 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
11060 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
11070 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  use.** is no lon
11080 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
11090 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61  * If the nFin pa
110a0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
110b0 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  ero, the impleme
110c0 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a  ntation assumes.
110d0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ** that the call
110e0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
110f0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
11100 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69  tep() until.** i
11110 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
11120 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f  _DONE or an erro
11130 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e  r, and that nFin
11140 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   is the.** numbe
11150 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64  r of pages the d
11160 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
11170 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20  l contain after 
11180 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73  this .** process
11190 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f   is complete..*/
111a0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
111b0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
111c0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
111d0 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61  Fin){.  Pgno iLa
111e0 73 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  stPg;           
111f0 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69    /* Last page i
11200 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
11210 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  /.  Pgno nFreeLi
11220 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
11230 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
11240 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
11250 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
11260 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11270 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11280 74 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50  tex) );.  iLastP
11290 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  g = pBt->nTrunc;
112a0 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d  .  if( iLastPg==
112b0 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67  0 ){.    iLastPg
112c0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
112d0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  t(pBt);.  }..  i
112e0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
112f0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
11300 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
11310 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
11320 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
11330 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
11340 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
11350 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
11360 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
11370 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
11380 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
11390 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e  FreeList==0 || n
113a0 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a  Fin==iLastPg ){.
113b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
113c0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
113d0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
113e0 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
113f0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
11400 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11420 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11430 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
11440 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
11450 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
11460 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11470 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
11480 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
11490 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
114a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69  ){.      if( nFi
114b0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
114c0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
114d0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
114e0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
114f0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
11500 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
11510 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nFin is non-zero
11520 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
11530 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
11540 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
11550 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
11560 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
11570 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
11580 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
11590 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
115a0 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
115b0 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
115c0 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
115d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
115e0 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
115f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
11600 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
11610 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
11620 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
11630 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
11640 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20  LastPg, 1);.    
11650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11690 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
116a0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
116b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
116c0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
116d0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
116e0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
116f0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
11700 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
11710 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
11720 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
11730 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
11740 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  g;..      rc = s
11750 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
11760 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
11770 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
11780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
117a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
117b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
117c0 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
117d0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
117e0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
117f0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
11800 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
11810 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
11820 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
11830 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
11840 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
11850 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
11860 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
11870 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11880 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
11890 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
118a0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
118b0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
118c0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
118d0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
118e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
118f0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
11900 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
11910 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
11920 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
11930 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
11940 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
11950 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
11960 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11980 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
11990 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
119a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
119b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
119c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
119d0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
119e0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
119f0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
11a00 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
11a10 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
11a20 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
11a30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11a40 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
11a50 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
11a60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11a80 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
11a90 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
11aa0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
11ab0 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
11ac0 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
11ad0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11ae0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
11af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11b00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
11b10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
11b20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74      }.  }..  pBt
11b30 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74  ->nTrunc = iLast
11b40 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  Pg - 1;.  while(
11b50 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45   pBt->nTrunc==PE
11b60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11b70 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
11b80 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54  AGE(pBt, pBt->nT
11b90 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74  runc) ){.    pBt
11ba0 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a  ->nTrunc--;.  }.
11bb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11bc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
11bd0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11be0 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
11bf0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
11c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11c10 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
11c20 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
11c30 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
11c40 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
11c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11c60 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
11c70 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
11c80 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
11c90 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
11ca0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
11cb0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
11cc0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
11cd0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
11ce0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
11cf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
11d00 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
11d10 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
11d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11d30 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
11d40 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
11d50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11d60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
11d70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11d80 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
11d90 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
11da0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
11db0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
11dc0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
11dd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
11de0 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
11df0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
11e00 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
11e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
11e20 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
11e30 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
11e40 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
11e50 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20  mStep(pBt, 0);. 
11e60 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
11e70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11e80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11e90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11ea0 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
11eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
11ec0 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
11ed0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
11ee0 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
11ef0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
11f00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
11f10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11f20 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
11f30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
11f40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
11f50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
11f60 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
11f70 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
11f80 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
11f90 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
11fa0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
11fb0 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
11fc0 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
11fd0 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
11fe0 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
11ff0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
12000 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
12010 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
12020 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e  Bt, Pgno *pnTrun
12030 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
12040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
12050 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
12060 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
12070 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
12080 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
12090 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
120a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
120b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
120c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
120d0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
120e0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
120f0 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
12100 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
12110 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
12120 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
12130 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  in = 0;..    if(
12140 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20   pBt->nTrunc==0 
12150 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46  ){.      Pgno nF
12160 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ree;.      Pgno 
12170 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63  nPtrmap;.      c
12180 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
12190 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  pBt->pageSize;. 
121a0 20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20       Pgno nOrig 
121b0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
121c0 28 70 42 74 29 3b 0a 0a 20 20 20 20 20 20 69 66  (pBt);..      if
121d0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
121e0 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20  pBt, nOrig) ){. 
121f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12200 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12210 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
12220 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44   if( nOrig==PEND
12230 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
12240 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  t) ){.        nO
12250 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  rig--;.      }. 
12260 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74       nFree = get
12270 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12280 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
12290 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20        nPtrmap = 
122a0 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
122b0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
122c0 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28  nOrig)+pgsz/5)/(
122d0 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e  pgsz/5);.      n
122e0 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
122f0 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
12300 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50       if( nOrig>P
12310 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
12320 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50  (pBt) && nFin<=P
12330 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
12340 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
12350 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
12360 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54  .      while( PT
12370 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
12380 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
12390 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
123a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
123b0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
123c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  }.    }..    whi
123d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
123e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
123f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
12400 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d  Bt, nFin);.    }
12410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12420 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
12430 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30    assert(nFin==0
12440 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d   || pBt->nTrunc=
12450 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d  =0 || nFin<=pBt-
12460 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20  >nTrunc);.      
12470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12480 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
12490 54 72 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b  Trunc && nFin ){
124a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
124b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
124c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
124d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
124e0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
124f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
12500 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
12510 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12520 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
12530 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
12540 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20  nTrunc = nFin;. 
12550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
12580 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
12590 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
125a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
125b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
125c0 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e  *pnTrunc = pBt->
125d0 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d  nTrunc;.    pBt-
125e0 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >nTrunc = 0;.  }
125f0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
12600 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
12610 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
12620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12630 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
12640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12650 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
12660 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12670 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
12680 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
12690 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
126a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
126b0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
126c0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
126d0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
126e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
126f0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
12700 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
12710 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
12720 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
12730 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
12740 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
12750 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
12760 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12770 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
12780 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
12790 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
127a0 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
127b0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
127c0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
127d0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
127e0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
127f0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
12800 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
12810 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
12820 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
12830 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
12840 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
12850 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
12860 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
12870 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12880 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
12890 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
128a0 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
128b0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
128c0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
128d0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
128e0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
128f0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
12900 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
12910 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
12920 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
12930 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
12940 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
12950 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
12960 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
12970 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
12980 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
12990 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
129a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
129b0 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
129c0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
129d0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
129e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
129f0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
12a00 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12a10 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
12a20 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
12a30 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
12a40 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
12a50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12a60 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
12a70 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12a80 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
12a90 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12aa0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12ab0 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
12ac0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
12ad0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
12ae0 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
12af0 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
12b00 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12b10 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
12b20 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
12b30 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
12b40 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
12b50 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
12b60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12b70 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
12b80 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
12b90 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12ba0 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
12bb0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12bc0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12be0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12c00 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12c10 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12c20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12c30 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
12c40 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
12c50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12c60 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
12c70 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66  >db = p->db;.#if
12c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12c90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
12ca0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
12cb0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
12cc0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
12cd0 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
12ce0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
12cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12d10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12d20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
12d40 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
12d50 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
12d60 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
12d70 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
12d80 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  runc, 0);.    sq
12d90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12da0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
12db0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
12dc0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
12dd0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
12de0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
12df0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12e00 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
12e10 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
12e20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
12e30 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
12e40 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
12e50 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
12e60 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
12e70 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
12e80 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12e90 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
12ea0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
12eb0 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
12ec0 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
12ed0 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
12ee0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
12ef0 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
12f00 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
12f10 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
12f20 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
12f30 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
12f40 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
12f50 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
12f60 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
12f70 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
12f80 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
12f90 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
12fa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
12fb0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
12fc0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
12fd0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
12fe0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
12ff0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13000 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
13010 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
13020 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
13030 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
13040 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
13050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
13060 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
13070 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
13080 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13090 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
130a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
130b0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
130c0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
130d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
130e0 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
130f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
13100 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
13110 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
13120 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13130 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
13140 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
13150 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
13160 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13170 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
13180 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
13190 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
131a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
131b0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
131c0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
131d0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
131e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
131f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
13200 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
13210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
13230 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13250 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
13260 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13270 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
13280 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
13290 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
132a0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
132b0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
132c0 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
132d0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
132e0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
132f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
13300 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
13310 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
13320 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13330 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
13340 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
13350 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
13360 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
13370 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
13380 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
13390 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
133a0 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
133b0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
133c0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
133d0 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
133e0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
133f0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
13400 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
13410 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13420 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
13430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13440 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
13450 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
13460 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
13470 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
13480 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
13490 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
134a0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
134b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
134c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
134d0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
134e0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
134f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
13500 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
13510 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
13520 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13530 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
13540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13550 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
13560 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
13570 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13580 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
13590 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
135a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
135b0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
135c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
135d0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
135e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
135f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
13600 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13610 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
13620 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13630 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13640 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
13650 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
13660 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
13670 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
13680 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
13690 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
136a0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
136b0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
136c0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
136d0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
136e0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
136f0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
13700 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
13710 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
13720 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
13730 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
13740 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
13750 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
13760 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
13770 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
13780 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
13790 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
137a0 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
137b0 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
137c0 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
137d0 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
137e0 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
137f0 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
13800 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
13810 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
13820 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
13830 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
13840 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
13850 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
13860 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
13870 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
13880 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
13890 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
138a0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
138b0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
138c0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
138d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
138e0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
138f0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
13900 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
13910 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
13920 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
13930 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
13940 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
13950 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
13960 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
13970 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
13980 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
13990 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
139a0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
139b0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
139c0 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
139d0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
139e0 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
139f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13a00 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
13a10 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13a20 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
13a30 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
13a40 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
13a50 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
13a60 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
13a70 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
13a80 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
13a90 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
13aa0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13ab0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
13ac0 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
13ad0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
13ae0 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
13af0 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
13b00 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
13b10 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
13b20 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
13b30 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
13b40 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
13b50 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
13b60 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
13b70 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
13b80 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
13b90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
13ba0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
13bb0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
13bc0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
13bd0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
13be0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13bf0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
13c00 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
13c10 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
13c20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
13c30 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
13c40 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
13c50 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
13c60 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
13c70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
13c80 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
13c90 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
13ca0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
13cb0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
13cc0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
13cd0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
13ce0 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
13cf0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
13d00 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
13d10 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
13d20 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
13d30 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
13d40 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
13d50 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
13d60 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
13d70 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
13d80 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
13d90 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
13da0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
13db0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13dc0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
13dd0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
13de0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
13df0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
13e00 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
13e10 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
13e20 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
13e30 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
13e40 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13e50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
13e60 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
13e70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13e80 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13e90 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
13ea0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
13eb0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
13ec0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13ed0 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
13ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
13ef0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
13f00 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
13f10 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
13f20 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  ) error occured 
13f30 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
13f40 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
13f50 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
13f60 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
13f70 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
13f80 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
13f90 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
13fa0 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
13fb0 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
13fc0 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
13fd0 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
13fe0 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
13ff0 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
14000 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
14010 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
14020 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
14030 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14040 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
14050 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
14060 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
14070 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
14080 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
14090 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
140a0 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
140b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
140c0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
140d0 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
140e0 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
140f0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
14100 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
14110 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
14120 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
14130 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
14140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14150 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14160 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
14170 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
14180 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
14190 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
141a0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
141b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
141c0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
141d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
141e0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
141f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
14200 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
14210 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
14220 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
14230 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
14240 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
14250 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
14260 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
14270 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
14280 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
14290 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
142a0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
142b0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
142c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
142d0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
142e0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
142f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
14300 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14310 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14320 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
14330 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
14340 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
14350 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
14360 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
14370 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
14380 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
14390 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
143a0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
143b0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
143c0 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
143d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
143e0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
143f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
14400 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
14410 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
14420 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
14430 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
14440 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
14450 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
14460 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
14470 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
14480 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
144a0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
144b0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
144c0 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74  ction.  The subt
144d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a  ransaction can.*
144e0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
144f0 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
14500 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
14510 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59  ransaction..** Y
14520 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
14530 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
14540 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
14550 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  btransaction..**
14560 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
14570 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
14580 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68  omatically if th
14590 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
145a0 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72  on.** commits or
145b0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
145c0 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74  ** Only one subt
145d0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
145e0 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69  e active at a ti
145f0 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  me.  It is an er
14600 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f  ror to try.** to
14610 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62   start a new sub
14620 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61  transaction if a
14630 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61  nother subtransa
14640 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
14650 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53   active..**.** S
14660 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
14670 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
14680 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
14690 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
146a0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
146b0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
146c0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
146d0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
146e0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
146f0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
14700 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
14710 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
14720 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
14730 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
14740 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
14750 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
14760 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
14770 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
14780 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
14790 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
147a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
147b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
147c0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
147d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
147e0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
147f0 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e    if( (p->inTran
14800 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  s!=TRANS_WRITE) 
14810 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29  || pBt->inStmt )
14820 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
14830 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
14840 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
14850 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
14860 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14870 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14880 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
14890 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  );.    rc = pBt-
148a0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
148b0 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50  TE_OK : sqlite3P
148c0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42  agerStmtBegin(pB
148d0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
148e0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
148f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
14900 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
14920 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
14930 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
14940 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
14950 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
14960 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
14970 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14980 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
14990 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
149a0 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
149b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
149c0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
149d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
149e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
149f0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
14a00 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
14a10 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
14a20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
14a30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14a40 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
14a50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
14a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
14a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14a80 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
14a90 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
14aa0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14ab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14ac0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
14ad0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
14ae0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
14af0 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
14b00 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
14b10 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
14b20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14b30 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
14b40 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
14b50 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
14b60 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
14b70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
14b80 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
14b90 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
14ba0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
14bb0 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
14bc0 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
14bd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14be0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
14bf0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
14c00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14c10 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14c20 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
14c30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14c40 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
14c50 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
14c60 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
14c70 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
14c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14c90 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
14ca0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
14cb0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
14cc0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
14cd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14cf0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
14d00 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
14d10 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
14d20 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
14d30 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
14d40 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
14d50 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
14d60 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
14d70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14d80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
14d90 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
14da0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
14db0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
14dc0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
14dd0 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
14de0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
14df0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
14e00 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
14e10 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
14e20 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
14e30 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
14e40 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
14e50 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
14e60 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
14e70 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
14e80 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
14e90 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
14ea0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
14eb0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
14ec0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
14ed0 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
14ee0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14ef0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
14f00 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
14f10 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
14f20 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
14f30 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
14f40 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
14f50 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
14f60 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
14f70 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
14f80 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
14f90 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
14fa0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
14fb0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
14fc0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
14fd0 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
14fe0 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
14ff0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
15000 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15010 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
15020 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
15030 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
15040 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
15050 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
15060 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
15070 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
15080 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
15090 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
150a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
150b0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
150c0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
150d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
150e0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
150f0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
15100 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
15110 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
15120 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
15130 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
15140 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
15150 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20  reeCursorSize() 
15160 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
15170 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .** pointed to b
15180 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e  y pCur have been
15190 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63   zeroed by the c
151a0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
151b0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
151c0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
151f0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
15200 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
15230 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
15240 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
15250 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15270 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
15280 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
15290 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
152a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
152b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
152c0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
152d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
152e0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
15310 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
15320 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
15330 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53  gno nPage;.  BtS
15340 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15350 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
15360 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
15370 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
15380 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
15390 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
153a0 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
153b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
153c0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
153d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
153e0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
153f0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
15400 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
15410 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  0, 0) ){.      r
15420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
15430 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
15440 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
15450 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
15460 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
15470 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
15480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
154a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
154b0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
154c0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
154d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
154e0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
154f0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
15500 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
15510 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  le;.  rc = sqlit
15520 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
15530 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69  (pBt->pPager, (i
15540 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20  nt *)&nPage); . 
15550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15560 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15570 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   rc;.  }.  if( i
15580 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67  Table==1 && nPag
15590 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  e==0 ){.    rc =
155a0 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
155b0 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
155c0 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
155d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
155e0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
155f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
15600 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
15610 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
15630 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
15640 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
15650 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
15660 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
15670 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
15680 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
15690 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
156a0 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68  riables, link th
156b0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
156c0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20  e BtShared list 
156d0 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28  and set *ppCur (
156e0 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20  the.  ** output 
156f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
15700 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f   function)..  */
15710 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
15720 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
15730 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
15740 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
15750 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  pBt;.  pCur->wrF
15760 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67  lag = (u8)wrFlag
15770 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
15780 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
15790 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
157a0 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
157b0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
157c0 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
157d0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
157e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
157f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
15800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15810 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
15820 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
15830 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
15840 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
15850 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
15860 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
15870 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
15880 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15890 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
158d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15900 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
15910 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
15920 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15950 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
15960 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
15970 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
15980 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
15990 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
159a0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
159b0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
159c0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
159f0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
15a00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15a10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15a20 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
15a30 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
15a40 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
15a50 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
15a60 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
15a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15a80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15a90 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
15aa0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15ab0 53 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e  Size(){.  return
15ac0 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72   sizeof(BtCursor
15ad0 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  );.}..../*.** Cl
15ae0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
15af0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
15b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15b10 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
15b20 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
15b30 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
15b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15b50 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
15b60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15b70 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
15b80 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
15b90 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
15ba0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15bb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15bc0 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
15bd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15be0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42  (pBtree);.    pB
15bf0 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  t->db = pBtree->
15c00 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  db;.    sqlite3B
15c10 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
15c20 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
15c30 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
15c40 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
15c50 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
15c60 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15c70 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15c80 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15c90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15ca0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
15cb0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
15cc0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
15cd0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
15ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
15cf0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
15d00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
15d10 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
15d20 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
15d30 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15d40 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
15d50 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
15d60 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
15d70 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
15d80 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
15d90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15da0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
15db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
15dd0 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
15de0 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
15df0 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
15e00 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
15e10 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
15e20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
15e30 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
15e40 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  e Btree..*/.void
15e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
15e60 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
15e70 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
15e80 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
15e90 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
15ea0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
15eb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d  tex(pCur) );.  m
15ec0 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
15ed0 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43  pCur, sizeof(BtC
15ee0 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70  ursor));.  pTemp
15ef0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
15f00 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
15f10 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  v = 0;.  for(i=0
15f20 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69  ; i<=pTempCur->i
15f30 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
15f40 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
15f50 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65  pTempCur->apPage
15f60 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
15f70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65   }.  assert( pTe
15f80 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29  mpCur->pKey==0 )
15f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
15fa0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
15fb0 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
15fc0 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
15fd0 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
15fe0 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
15ff0 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
16000 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
16010 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
16020 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
16030 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16040 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
16050 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f  ex(pCur) );.  fo
16060 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
16070 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
16080 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
16090 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ef(pCur->apPage[
160a0 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
160b0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
160c0 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a  (pCur->pKey);.}.
160d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
160e0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
160f0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
16100 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
16110 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
16120 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
16130 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
16140 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
16150 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
16160 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
16170 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
16180 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
16190 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
161a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
161b0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
161c0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
161d0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
161e0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
161f0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
16200 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
16210 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
16220 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
16230 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
16240 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
16250 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
16260 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
16270 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
16280 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
16290 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
162a0 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
162b0 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
162c0 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
162d0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
162e0 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
162f0 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
16300 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
16310 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
16320 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
16330 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
16340 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
16350 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
16360 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
16370 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
16380 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
16390 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
163a0 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
163b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
163c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
163d0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
163e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
163f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
16400 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
16410 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
16420 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
16430 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
16440 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16450 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
16460 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
16470 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
16480 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
16490 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
164a0 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
164b0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
164c0 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
164d0 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
164e0 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
164f0 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
16500 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
16510 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
16520 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
16530 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
16540 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
16550 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
16560 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
16570 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
16580 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
16590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
165a0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
165b0 50 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Page;.      sqli
165c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
165d0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
165e0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
165f0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
16600 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
16610 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
16620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16630 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
16640 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
16650 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
16660 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
16670 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
16680 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
16690 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
166a0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
166b0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
166c0 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
166d0 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
16710 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
16720 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16760 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
16770 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
167b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
167c0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
167d0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
167e0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
167f0 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
16800 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
16810 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
16850 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
168a0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
168b0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
168f0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
16900 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
16910 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
16920 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
16930 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
16940 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
16950 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
16960 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
16970 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
16980 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
16990 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
169a0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
169b0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
169c0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
169d0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
169e0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
169f0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
16a00 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
16a10 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
16a20 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
16a30 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
16a40 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
16a50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
16a60 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
16a70 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
16a80 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
16a90 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
16aa0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
16ab0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
16ac0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
16ae0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
16af0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16b00 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
16b10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
16b20 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
16b30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
16b40 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
16b50 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
16b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
16b70 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
16b80 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
16b90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
16ba0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16bb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16bc0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
16bd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16be0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
16bf0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
16c00 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
16c10 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
16c20 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
16c30 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
16c40 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
16c50 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
16c60 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
16c70 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
16c80 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
16c90 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
16ca0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
16cb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
16cc0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
16cd0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
16ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16cf0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
16d00 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
16d10 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
16d20 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
16d30 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
16d40 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
16d50 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
16d60 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
16d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
16d90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16da0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
16db0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16dc0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
16dd0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
16de0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16df0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
16e00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
16e10 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
16e20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
16e30 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
16e40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16e50 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
16e60 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
16e70 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
16e80 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
16e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16ea0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
16eb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16ec0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
16ed0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16ee0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
16ef0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
16f00 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
16f10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
16f20 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
16f30 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
16f40 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
16f50 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
16f60 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
16f70 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
16f80 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
16f90 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
16fa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16fb0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
16fc0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
16fd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
16fe0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16ff0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17000 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
17010 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78   Unless pPgnoNex
17020 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70  t is NULL, the p
17030 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17040 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
17050 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20  .** page in the 
17060 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77  linked list is w
17070 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
17080 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
17090 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  fl.** is the las
170a0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
170b0 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
170c0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
170d0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
170e0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
170f0 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
17100 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
17110 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
17120 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
17130 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
17140 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
17150 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
17160 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
17170 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
17180 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
17190 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
171a0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
171b0 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
171c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
171d0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
171e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
171f0 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
17220 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
17230 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
17240 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
17250 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
17260 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17280 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
17290 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
172a0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
172b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
172c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
172d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
172e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
172f0 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
17300 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
17310 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
17320 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
17330 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
17340 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
17350 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
17360 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
17370 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
17380 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17390 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
173a0 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
173b0 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
173c0 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
173d0 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
173e0 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
173f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
17400 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
17410 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
17420 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
17430 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
17440 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
17450 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17460 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
17470 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
17480 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
17490 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
174a0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
174b0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
174c0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
174d0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
174e0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
174f0 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
17500 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
17510 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
17520 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
17530 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
17540 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
17550 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
17560 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
17570 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
17580 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
17590 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
175a0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
175b0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
175c0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
175d0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
175e0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
175f0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
17600 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
17610 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
17620 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17630 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
17640 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
17650 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
17660 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
17670 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
17680 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
17690 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
176a0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
176b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
176c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
176d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
176e0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
176f0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
17700 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
17710 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
17720 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
17730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
17740 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d  if..  if( next==
17750 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20  0 || ppPage ){. 
17760 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
17770 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  e = 0;..    rc =
17780 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17790 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
177a0 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29  &pPage, next!=0)
177b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d  ;.    assert(rc=
177c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
177d0 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28  age==0);.    if(
177e0 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d   next==0 && rc==
177f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17800 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
17810 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
17820 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17830 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20   ppPage ){.     
17840 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
17850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17860 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17870 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
17880 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
17890 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  next;..  return 
178a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  rc;.}../*.** Cop
178b0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
178c0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
178d0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
178e0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
178f0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
17900 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
17910 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
17920 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
17930 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
17940 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
17950 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
17960 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
17970 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
17980 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
17990 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
179a0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
179b0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
179c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
179d0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
179e0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
179f0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
17a00 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
17a10 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
17a20 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
17a30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
17a40 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
17a50 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
17a60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
17a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
17a80 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
17a90 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
17aa0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17ab0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
17ac0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ae0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
17af0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
17b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17b10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17b20 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
17b30 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
17b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
17b50 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
17b60 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
17b70 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
17b80 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
17b90 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
17ba0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
17bb0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
17bc0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
17bd0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
17be0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
17bf0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17c00 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
17c10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
17c20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
17c30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
17c60 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
17c70 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
17c80 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
17c90 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
17ca0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
17cb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17cc0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
17cd0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
17ce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17d00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d10 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
17d20 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
17d30 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
17d40 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
17d50 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
17d60 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
17d70 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
17d80 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
17d90 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
17da0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
17db0 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
17dc0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17dd0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
17de0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
17df0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
17e00 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
17e10 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
17e20 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
17e30 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
17e40 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
17e50 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
17e60 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
17e70 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
17e80 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
17e90 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
17ea0 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
17eb0 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
17ec0 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
17ed0 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
17ee0 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
17ef0 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
17f00 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
17f10 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
17f20 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
17f30 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
17f40 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
17f50 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
17f60 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
17f70 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
17f80 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
17f90 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
17fa0 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
17fb0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
17fc0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
17fd0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
17fe0 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
17ff0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
18000 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
18010 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
18020 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
18030 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
18040 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
18050 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
18060 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
18070 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
18080 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
18090 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
180a0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
180b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
180c0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
180d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
180e0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
180f0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
18100 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
18110 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
18120 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
18130 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
18140 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
18150 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
18160 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
18170 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
18180 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
18190 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
181a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
181b0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
181c0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
181d0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
181e0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
181f0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
18200 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
18210 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
18220 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
18230 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
18240 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
18250 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
18260 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
18270 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
18280 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
18290 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
182a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
182b0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
182c0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
182d0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
182e0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
182f0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
18300 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
18310 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
18320 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
18330 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
18340 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
18350 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
18360 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
18370 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
18380 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
18390 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
183a0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
183b0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
183c0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
183d0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
183e0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
183f0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
18400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18410 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
18420 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
18430 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
18440 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
18450 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
18460 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
18470 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
18480 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18490 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
184a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
184b0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
184c0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
184d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
184e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
184f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18500 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
18510 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
18520 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
18530 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
18540 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18550 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18560 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
18570 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
18580 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
18590 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
185a0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
185b0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
185c0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
185d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
185e0 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
185f0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
18600 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
18610 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
18620 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
18630 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  ta .   || &aPayl
18640 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
18650 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
18660 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
18670 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
18680 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
18690 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
186a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
186b0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
186c0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
186d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
186e0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
186f0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
18700 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
18710 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
18720 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
18730 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
18740 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18750 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
18760 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
18770 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
18780 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
18790 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
187a0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
187b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
187c0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
187d0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
187e0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
187f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
18800 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
18810 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
18820 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
18830 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
18840 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
18850 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
18860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18870 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
18880 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
18890 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
188a0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
188b0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
188c0 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
188d0 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
188e0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
188f0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
18900 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
18910 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
18920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
18930 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
18940 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
18950 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
18960 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
18970 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
18980 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
18990 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
189a0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
189b0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
189c0 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
189d0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
189e0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
189f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
18a00 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
18a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
18a20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
18a30 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
18a40 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
18a50 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
18a60 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
18a70 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
18a80 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
18a90 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
18aa0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
18ab0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
18ac0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
18ad0 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
18ae0 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
18af0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
18b00 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
18b10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
18b20 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
18b30 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
18b40 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
18b50 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18b60 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
18b70 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
18b80 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
18b90 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
18ba0 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
18bb0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
18bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18bd0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
18be0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18bf0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
18c00 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
18c10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
18c20 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
18c30 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
18c40 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
18c50 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
18c60 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
18c70 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
18c80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
18c90 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
18ca0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
18cb0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
18cc0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
18cd0 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
18ce0 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
18cf0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
18d00 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
18d10 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
18d20 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
18d30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
18d40 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
18d50 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
18d60 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
18d70 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
18d80 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
18d90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
18da0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
18db0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
18dc0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
18dd0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
18de0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
18df0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
18e00 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18e10 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
18e20 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
18e30 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
18e40 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18e50 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
18e60 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
18e70 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
18e80 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
18e90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
18ea0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
18eb0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
18ec0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
18ed0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
18ee0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
18ef0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
18f00 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
18f10 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
18f20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
18f30 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
18f40 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
18f50 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
18f60 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
18f70 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
18f80 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
18f90 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
18fa0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
18fb0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
18fc0 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
18fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
18fe0 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
18ff0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
19000 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
19010 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
19020 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
19030 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
19040 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
19050 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
19060 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
19070 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
19080 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
19090 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
190a0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
190b0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
190c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
190d0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
190e0 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
190f0 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
19100 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
19110 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
19120 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
19130 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
19140 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
19150 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
19160 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
19170 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
19180 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
19190 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
191a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
191b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
191c0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
191d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
191e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
191f0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
19200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
19210 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
19220 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
19230 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
19240 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
19250 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
19260 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
19270 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
19280 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
19290 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
192a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
192b0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
192c0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
192d0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
192e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
192f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
19300 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
19310 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
19320 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
19330 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
19340 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
19350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19360 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
19370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19380 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
19390 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
193a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
193b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
193c0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
193d0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
193e0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
193f0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
19400 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
19410 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
19420 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
19430 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
19440 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
19450 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
19460 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
19470 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
19480 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
19490 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
194a0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
194b0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
194c0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
194d0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
194e0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
194f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19500 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
19510 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
19520 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
19530 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
19540 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
19550 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19560 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
19570 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
19580 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
19590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
195a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
195b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
195c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
195d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
195e0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
195f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19600 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  age] );.    if( 
19610 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
19620 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
19630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19640 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19650 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19660 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
19670 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
19680 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
19690 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
196a0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
196b0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
196c0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
196d0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
196e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
196f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
19700 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
19710 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
19720 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
19730 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
19740 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
19750 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
19760 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
19770 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
19780 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
19790 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
197a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
197b0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
197c0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
197d0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
197e0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
197f0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
19800 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
19810 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
19820 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
19830 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
19840 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
19850 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
19860 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
19870 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
19880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19890 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
198a0 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
198b0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
198c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
198d0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
198e0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
198f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19900 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
19910 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
19920 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
19930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19940 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19950 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19960 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
19970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
19980 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
19990 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
199a0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
199b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
199c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
199d0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
199e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
199f0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
19a00 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
19a10 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
19a20 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
19a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19a40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19a50 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
19a60 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
19a70 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
19a80 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
19a90 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
19aa0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
19ab0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
19ac0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
19ad0 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
19ae0 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
19af0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
19b00 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
19b10 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
19b20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19b30 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
19b40 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
19b50 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
19b60 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
19b70 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
19b80 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
19b90 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
19ba0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
19bb0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
19bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
19bd0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
19be0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
19bf0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
19c00 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
19c10 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
19c20 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
19c30 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
19c40 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
19c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
19c60 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
19c70 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
19c80 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
19c90 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
19ca0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
19cb0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
19cc0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
19cd0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
19ce0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
19cf0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
19d00 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mbly.** the key/
19d10 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
19d20 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
19d30 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
19d40 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
19d50 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
19d60 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
19d70 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
19d80 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
19d90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
19da0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
19db0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
19dc0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
19dd0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
19de0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
19df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
19e00 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
19e10 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
19e20 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
19e30 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
19e40 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
19e50 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
19e60 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
19e70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
19e80 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19e90 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
19ea0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
19eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
19ec0 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
19ed0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
19ee0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
19ef0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
19f00 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
19f10 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
19f20 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
19f30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
19f40 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
19f50 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
19f60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
19f70 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
19f80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19f90 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
19fa0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19fb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19fc0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
19fd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19fe0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
19ff0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1a000 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1a010 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1a020 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1a030 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1a040 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1a050 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1a060 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1a070 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1a080 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1a090 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a0a0 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1a0b0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1a0c0 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1a0d0 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1a0e0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1a0f0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1a100 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1a110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1a120 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1a130 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1a140 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1a150 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1a160 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1a170 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1a180 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1a190 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1a1a0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1a1b0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1a1c0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1a1d0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1a1e0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1a1f0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1a200 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1a210 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1a220 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1a230 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1a240 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1a250 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1a260 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1a270 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1a280 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1a290 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1a2a0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1a2b0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1a2c0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1a2d0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1a2e0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1a2f0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1a300 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1a310 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1a320 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1a330 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1a340 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1a350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1a360 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1a370 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1a380 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1a390 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1a3a0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1a3b0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1a3c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1a3d0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1a3e0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1a3f0 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1a400 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1a410 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1a420 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a430 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1a440 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a450 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1a460 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1a470 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1a480 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1a490 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1a4a0 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n 0;.}.const voi
1a4b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1a4c0 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1a4d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1a4e0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
1a4f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1a500 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1a510 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a520 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1a530 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1a540 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1a550 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1a560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1a570 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1a580 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a590 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1a5a0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1a5b0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1a5c0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1a5d0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1a5e0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1a5f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1a600 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1a610 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1a620 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1a630 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1a640 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1a650 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1a660 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a670 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1a680 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a690 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a6a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a6b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a6c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1a6d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1a6e0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1a6f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1a700 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1a710 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1a720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a730 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a740 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1a750 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1a760 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1a770 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1a780 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1a790 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1a7a0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1a7b0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1a7c0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1a7d0 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1a7e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1a7f0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1a800 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1a810 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
1a820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a830 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a840 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1a860 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1a870 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1a880 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1a890 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1a8a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1a8b0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1a8c0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1a8d0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1a8e0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1a8f0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1a900 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1a910 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1a920 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1a930 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1a940 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1a950 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1a960 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1a970 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1a980 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1a990 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1a9a0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1a9b0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1a9c0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1a9d0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1a9e0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1a9f0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1aa00 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1aa10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1aa20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1aa30 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1aa40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1aa50 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1aa60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1aa70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1aa80 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1aa90 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1aaa0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1aab0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1aac0 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1aad0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1aae0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1aaf0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1ab00 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1ab10 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1ab20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1ab30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1ab40 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1ab50 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1ab60 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1ab70 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1ab80 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1ab90 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1aba0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1abb0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1abc0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1abd0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1abe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1abf0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1ac00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ac10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ac20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ac30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ac40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ac50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1ac60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1ac70 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1ac80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ac90 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1aca0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1acb0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1acc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1acd0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1ace0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1acf0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1ad00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ad10 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
1ad20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1ad30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ad40 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
1ad50 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
1ad60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1ad70 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1ad80 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
1ad90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ada0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1adb0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1adc0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1add0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1ade0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1adf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ae00 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1ae10 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1ae20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ae30 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1ae40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ae50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ae60 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1ae70 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1ae80 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1ae90 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1aea0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1aeb0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1aec0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1aed0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1aee0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1aef0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1af00 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1af10 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1af20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1af30 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1af40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1af50 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1af60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1af70 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1af80 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
1af90 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
1afa0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1afb0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
1afc0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1afd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1afe0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1aff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1b000 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1b010 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1b020 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1b030 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1b040 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
1b050 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
1b060 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1b070 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1b080 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1b090 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1b0a0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1b0b0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
1b0c0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1b0d0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1b0e0 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  t );.  pCur->iPa
1b0f0 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ge = 0;.  pCur->
1b100 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
1b110 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b120 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1b130 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1b140 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1b150 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
1b160 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1b170 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1b180 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1b190 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1b1a0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
1b1b0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
1b1c0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
1b1d0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
1b1e0 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
1b1f0 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
1b200 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1b210 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
1b220 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1b230 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
1b240 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
1b250 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1b260 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
1b270 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1b280 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1b290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1b2b0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1b2c0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
1b2d0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1b2e0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
1b2f0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1b300 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1b310 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
1b320 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
1b330 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1b340 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
1b350 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
1b360 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1b370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1b380 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
1b390 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1b3a0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1b3b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b3c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1b3d0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1b3e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b3f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1b400 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1b410 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1b420 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1b430 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1b440 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1b450 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
1b460 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1b470 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1b480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1b490 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b4a0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1b4b0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1b4c0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
1b4d0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
1b4e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1b4f0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1b500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1b520 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1b530 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1b540 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1b550 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1b560 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1b570 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1b580 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1b590 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1b5a0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1b5b0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1b5c0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1b5d0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1b5e0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1b5f0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1b600 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1b610 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1b620 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1b630 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1b640 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1b650 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1b660 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b670 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1b680 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1b690 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1b6a0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1b6b0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1b6c0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1b6d0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1b6e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1b6f0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1b700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b710 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1b720 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1b730 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1b740 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1b750 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1b760 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b770 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1b780 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1b790 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1b7a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1b7b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1b7c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1b7d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1b7e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1b7f0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
1b800 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1b810 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
1b820 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1b830 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1b840 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1b850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b860 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b870 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
1b880 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
1b890 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1b8a0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1b8b0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1b8c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b8d0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1b8e0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
1b8f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1b900 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1b910 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1b920 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1b930 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1b940 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1b950 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1b960 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1b970 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1b980 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1b990 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b9a0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
1b9b0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1b9c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1b9d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b9e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1ba00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ba10 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1ba20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1ba30 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1ba40 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1ba50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1ba60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ba70 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1ba80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ba90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1baa0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1bab0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
1bac0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
1bad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1baf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1bb00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1bb10 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
1bb20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1bb30 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1bb40 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1bb50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bb60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1bb70 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1bb80 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1bb90 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1bba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1bbb0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1bbc0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1bbd0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1bbe0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1bbf0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1bc00 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1bc10 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1bc20 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1bc30 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
1bc40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1bc50 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1bc60 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
1bc70 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1bc80 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1bc90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1bca0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1bcb0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1bcc0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1bcd0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1bce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bcf0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
1bd00 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1bd10 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1bd20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1bd30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1bd40 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1bd50 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1bd60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1bd80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1bd90 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
1bda0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1bdb0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1bdc0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1bdd0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1bde0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
1bdf0 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49  tLast = rc==SQLI
1be00 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20  TE_OK ?1:0;.    
1be10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1be20 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1be30 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1be40 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1be50 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
1be60 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
1be70 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
1be80 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
1be90 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
1bea0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
1beb0 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
1bec0 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
1bed0 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
1bee0 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
1bef0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1bf00 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
1bf10 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
1bf20 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
1bf30 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
1bf40 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
1bf50 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
1bf60 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
1bf70 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
1bf80 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
1bf90 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
1bfa0 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
1bfb0 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
1bfc0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
1bfd0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
1bfe0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
1bff0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
1c000 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
1c010 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1c020 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1c030 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1c040 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a  y to which the.*
1c050 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74  * cursor is writ
1c060 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20  ten to *pRes if 
1c070 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65  pRes!=NULL.  The
1c080 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74   meaning of.** t
1c090 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20  his value is as 
1c0a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c0b0 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1c0c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1c0d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1c0e0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1c110 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20   pKey or if the 
1c120 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
1c130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c140 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
1c150 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
1c160 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
1c170 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
1c180 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
1c190 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1c1a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1c1b0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
1c1d0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b  actly matches pK
1c1e0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
1c1f0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
1c200 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1c210 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1c220 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1c230 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
1c240 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  arger than pKey.
1c250 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
1c260 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1c270 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
1c280 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
1c290 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1c2a0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
1c2b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c2c0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
1c2d0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1c2e0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c300 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
1c310 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
1c320 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1c330 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1c340 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1c350 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1c360 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1c370 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1c380 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
1c390 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1c3a0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1c3b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c3c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1c3d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c3e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1c3f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1c400 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1c410 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1c420 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
1c430 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
1c440 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
1c450 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
1c460 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
1c470 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
1c480 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
1c490 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c4a0 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
1c4b0 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
1c4c0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1c4d0 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
1c4e0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1c4f0 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
1c500 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1c510 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c520 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c530 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
1c540 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
1c550 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
1c560 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
1c570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c590 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
1c5a0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1c5b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1c5c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1c5d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1c5e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c5f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1c600 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1c610 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
1c620 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1c630 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1c640 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1c650 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1c660 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1c670 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1c680 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1c690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c6a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1c6b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1c6c0 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
1c6d0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
1c6e0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
1c6f0 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
1c700 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
1c710 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
1c720 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c730 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  e];.    int c = 
1c740 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1c750 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1c760 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1c770 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1c780 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1c790 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1c7a0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1c7b0 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 20  y && pIdxKey==0 
1c7c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c7d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c7e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
1c7f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c800 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1c810 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1c820 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1c830 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70  iPage] = (u16)up
1c840 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1c850 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1c860 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1c870 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32  u16)((upr+lwr)/2
1c880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c890 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28   lwr<=upr ) for(
1c8a0 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  ;;){.      void 
1c8b0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1c8c0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1c8d0 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
1c8e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1c8f0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 70  >iPage];.      p
1c900 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1c910 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  = 0;.      pCur-
1c920 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1c930 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1c940 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1c950 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1c960 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
1c970 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
1c980 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
1c990 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
1c9a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
1c9b0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1c9c0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
1c9d0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
1c9e0 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
1c9f0 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
1ca00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
1ca10 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
1ca20 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
1ca30 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
1ca40 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
1ca50 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1ca60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ca70 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
1ca80 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1ca90 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1caa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cab0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
1cac0 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
1cad0 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1caf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1cb00 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1cb10 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1cb20 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1cb30 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1cb40 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1cb50 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1cb60 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1cb70 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1cb80 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1cb90 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1cba0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1cbb0 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65  Compare((int)nCe
1cbc0 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1cbd0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
1cbe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cbf0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
1cc00 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
1cc10 6e 74 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  nt)nCellKey );. 
1cc20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1cc30 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
1cc40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cc50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1cc60 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
1cc70 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1cc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cc90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1cca0 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
1ccb0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 28 76  int)nCellKey, (v
1ccc0 6f 69 64 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  oid*)pCellKey);.
1ccd0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
1cce0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ccf0 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65 6c  ompare((int)nCel
1cd00 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1cd10 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
1cd20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1cd30 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
1cd40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
1cd50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1cd60 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1cd70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1cd80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1cd90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
1cda0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1cdb0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1cdc0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1cdd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1cde0 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
1cdf0 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1ce00 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1ce10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1ce20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ce30 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1ce40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ce50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ce60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1ce70 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1ce80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ce90 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1cea0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
1ceb0 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
1cec0 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
1ced0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
1cee0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1cef0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  r ){.        pCu
1cf00 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1cf10 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1cf20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1cf30 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1cf40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1cf50 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29   (u16)((lwr+upr)
1cf60 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  /2);.    }.    a
1cf70 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
1cf80 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1cf90 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1cfa0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1cfb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
1cfc0 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
1cfd0 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
1cfe0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1cff0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1d000 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d010 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d020 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
1d030 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
1d040 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
1d050 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
1d060 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1d070 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
1d080 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1d090 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1d0a0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1d0b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1d0c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
1d0d0 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1d0e0 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
1d0f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d100 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1d110 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
1d120 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d130 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1d140 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
1d150 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1d160 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1d170 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
1d180 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1d190 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
1d1a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
1d1b0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
1d1c0 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
1d1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d1e0 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
1d1f0 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
1d200 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
1d210 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
1d220 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
1d230 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
1d240 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1d250 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
1d260 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
1d270 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
1d280 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1d290 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
1d2a0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1d2b0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20  3BtreeMoveto(.  
1d2c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d2d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
1d2e0 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
1d2f0 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
1d300 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1d310 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
1d320 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
1d330 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
1d340 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
1d350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
1d360 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
1d370 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
1d380 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
1d390 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
1d3a0 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
1d3b0 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
1d3c0 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
1d3d0 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
1d3e0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1d3f0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1d400 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d420 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
1d430 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d440 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
1d450 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
1d460 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1d470 52 65 63 6f 72 64 20 61 53 70 61 63 65 5b 31 36  Record aSpace[16
1d480 5d 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65  ]; /* Temp space
1d490 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
1d4a0 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
1d4b0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
1d4c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
1d4d0 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
1d4e0 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
1d4f0 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1d500 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1d510 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
1d520 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20  t)nKey, pKey,.  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65      aSpace, size
1d560 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20  of(aSpace));.   
1d570 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
1d580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d590 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
1d5a0 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
1d5b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1d5c0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1d5d0 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
1d5e0 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
1d5f0 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
1d600 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
1d610 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
1d620 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b  ckedRecord(pIdxK
1d630 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
1d640 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1d650 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1d660 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1d670 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1d680 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1d690 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1d6a0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1d6b0 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1d6c0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1d6d0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1d6e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1d6f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1d700 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1d710 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1d720 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1d730 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1d740 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1d750 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1d760 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d770 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1d780 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1d790 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1d7a0 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1d7b0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1d7c0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1d7d0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1d7e0 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1d7f0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1d800 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1d810 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1d820 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1d830 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1d840 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1d850 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1d860 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1d870 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1d880 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1d890 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d8a0 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72  handle for a cur
1d8b0 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  sor..*/.sqlite3 
1d8c0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  *sqlite3BtreeCur
1d8d0 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75  sorDb(const BtCu
1d8e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1d8f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d900 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1d910 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1d920 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  x) );.  return p
1d930 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  Cur->pBtree->db;
1d940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
1d950 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1d960 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
1d970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1d980 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1d990 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1d9a0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1d9b0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1d9c0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1d9d0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1d9e0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
1d9f0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
1da00 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
1da10 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
1da20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1da30 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
1da40 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1da50 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1da60 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
1da70 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1da80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1da90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1daa0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1dab0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1dac0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1dad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1daf0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
1db00 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  0 );.  if( CURSO
1db10 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1db20 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1db30 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1db40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1db50 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1db60 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43  skip>0 ){.    pC
1db70 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1db80 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1db90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dba0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1dbb0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
1dbc0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1dbd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1dbe0 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
1dbf0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1dc00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
1dc10 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1dc20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61  assert( idx<=pPa
1dc30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1dc40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1dc50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1dc60 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
1dc70 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
1dc80 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1dc90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dca0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1dcb0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1dcc0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1dcd0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1dce0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1dcf0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1dd00 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1dd10 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1dd20 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1dd30 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1dd40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1dd50 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1dd60 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
1dd70 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
1dd80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
1dd90 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1dda0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1ddb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ddc0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1ddd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1dde0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
1ddf0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
1de00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1de10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1de20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
1de30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1de40 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
1de50 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
1de60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1de70 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1de80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1de90 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
1dea0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1deb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dec0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
1ded0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1dee0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
1def0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1df00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
1df20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1df30 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1df40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
1df50 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
1df60 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
1df70 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
1df80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1df90 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1dfa0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1dfb0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1dfc0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1dfd0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1dfe0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1dff0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1e000 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1e010 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1e020 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1e030 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1e040 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1e050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1e060 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1e070 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
1e080 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1e090 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e0a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1e0b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1e0c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1e0d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1e0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1e0f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
1e100 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
1e110 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1e120 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1e130 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1e140 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1e150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1e160 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30  if( pCur->skip<0
1e170 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1e180 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1e190 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1e1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e1b0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1e1c0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
1e1d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e1e0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1e1f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1e200 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
1e210 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
1e220 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1e230 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e240 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1e250 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1e260 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1e270 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
1e280 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e2a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
1e2b0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
1e2c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e2d0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
1e2e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
1e2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1e300 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
1e310 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1e320 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1e330 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1e340 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1e350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e360 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1e370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e380 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  MoveToParent(pCu
1e390 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  r);.    }.    pC
1e3a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1e3b0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1e3c0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
1e3d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1e3e0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
1e3f0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1e400 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e410 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
1e420 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
1e430 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1e440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e450 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1e460 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1e470 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1e480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e490 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1e4a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1e4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1e4c0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1e4d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1e4e0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1e4f0 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1e500 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1e510 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1e520 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e530 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1e540 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1e550 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1e560 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1e570 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1e580 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1e590 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1e5a0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1e5b0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1e5c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e5d0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1e5e0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1e5f0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1e600 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1e610 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1e620 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1e630 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1e640 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1e650 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1e660 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1e670 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1e680 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1e690 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1e6a0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1e6b0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1e6c0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1e6d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1e6e0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1e6f0 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1e700 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1e710 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1e720 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1e730 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1e740 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1e750 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1e760 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1e770 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1e780 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1e790 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1e7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e7b0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1e7c0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1e7d0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1e7e0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1e7f0 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1e800 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1e810 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1e820 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1e830 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1e840 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1e850 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1e860 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1e870 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1e880 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1e890 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1e8a0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1e8b0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1e8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1e8d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1e8e0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1e8f0 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1e900 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1e910 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1e920 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1e930 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1e940 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1e950 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1e960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e970 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1e980 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1e990 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e9a0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1e9b0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1e9c0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1e9d0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1e9e0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1e9f0 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1ea00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ea10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ea20 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1ea30 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1ea40 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1ea50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1ea60 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1ea70 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1ea80 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1ea90 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1eaa0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1eab0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1eac0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1ead0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1eae0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1eaf0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1eb00 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1eb10 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1eb20 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1eb30 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1eb40 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1eb50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1eb60 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1eb70 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1eb80 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1eb90 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1eba0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1ebb0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1ebc0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1ebd0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1ebe0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1ebf0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ec00 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1ec10 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67  t && nearby<=pag
1ec20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1ec30 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
1ec40 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
1ec50 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
1ec60 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1ec70 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
1ec80 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1ec90 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
1eca0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
1ecb0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ecc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
1ecd0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1ece0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1ecf0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1ed00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1ed10 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
1ed20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ed30 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
1ed40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
1ed50 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
1ed60 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
1ed70 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
1ed80 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
1ed90 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
1eda0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
1edb0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
1edc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1edd0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1ede0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1edf0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ee00 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
1ee10 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ee20 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
1ee30 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
1ee40 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
1ee50 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
1ee60 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
1ee70 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
1ee80 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
1ee90 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
1eea0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1eeb0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
1eec0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
1eed0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
1eee0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
1eef0 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
1ef00 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
1ef10 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
1ef20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
1ef30 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1ef40 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1ef50 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1ef60 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
1ef70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ef80 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1ef90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1efa0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
1efb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1efc0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1efd0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
1efe0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  unk, 0);.      i
1eff0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1f000 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1f010 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f020 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f030 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
1f040 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1f050 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1f060 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
1f070 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
1f080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1f090 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
1f0a0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
1f0b0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
1f0c0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
1f0d0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
1f0e0 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
1f0f0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
1f100 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
1f110 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
1f120 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1f130 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
1f140 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
1f150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f160 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1f170 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1f180 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f190 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1f1a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1f1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f1c0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
1f1d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f1e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f1f0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1f200 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1f210 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1f220 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
1f230 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1f240 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1f250 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1f260 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1f270 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1f280 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
1f290 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
1f2a0 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
1f2b0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1f2c0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
1f2d0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
1f2e0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
1f2f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f300 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f310 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f320 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f340 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1f360 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
1f370 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
1f380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
1f390 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
1f3a0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
1f3b0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
1f3c0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1f3d0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
1f3e0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
1f3f0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
1f400 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f410 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1f420 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
1f430 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1f440 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1f450 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1f460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1f470 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f480 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1f490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1f4b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f4c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1f4d0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
1f4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1f4f0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1f510 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1f520 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1f530 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1f540 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f550 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1f560 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
1f570 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1f580 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1f590 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f5a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1f5c0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
1f5d0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
1f5e0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
1f5f0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
1f600 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
1f610 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
1f620 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
1f630 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
1f640 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1f650 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
1f660 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f670 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
1f680 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
1f690 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
1f6a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1f6b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
1f6c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f6d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f6e0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
1f6f0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
1f700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
1f730 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1f740 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1f750 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1f760 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f770 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
1f780 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f7a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f7b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f7c0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f7d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f7e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f7f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f800 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1f810 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
1f820 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1f830 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1f840 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
1f850 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
1f860 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1f870 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1f880 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
1f890 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
1f8a0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
1f8b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1f8c0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1f8d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1f8e0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1f8f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f900 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1f910 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
1f920 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
1f930 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f940 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1f950 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
1f960 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f980 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f990 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
1f9a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f9b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
1f9d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f9e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1f9f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1fa00 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
1fa10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1fa20 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1fa30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa40 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
1fa50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1fa60 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1fa70 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1fa80 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1fa90 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1faa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1fab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1fac0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
1fad0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
1fae0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c  /.        int cl
1faf0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
1fb00 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
1fb10 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1fb20 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
1fb30 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
1fb40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb50 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1fb60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fb70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fb80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1fb90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1fba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fbb0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
1fbc0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
1fbd0 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
1fbe0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1fbf0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
1fc00 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1fc10 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1fc20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
1fc30 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
1fc40 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1fc50 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1fc70 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
1fc80 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
1fc90 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
1fca0 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
1fcb0 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
1fcc0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
1fcd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1fce0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
1fd00 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
1fd10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1fd20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fd30 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1fd40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1fd50 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
1fd60 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1fd70 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
1fd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
1fd90 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
1fda0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
1fdb0 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67         Pgno nPag
1fdc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  e;.          *pP
1fdd0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
1fde0 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70         nPage = p
1fdf0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1fe00 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
1fe10 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29  ( *pPgno>nPage )
1fe20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1fe30 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74   Free page off t
1fe40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1fe50 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
1fe60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1fe70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fe80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1fe90 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1fea0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1feb0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1fec0 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
1fed0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
1fee0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
1fef0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
1ff00 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
1ff10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ff20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
1ff30 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
1ff40 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
1ff50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
1ff60 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
1ff70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1ff80 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1ff90 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
1ffa0 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
1ffb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1ffc0 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
1ffd0 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1ffe0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1fff0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
20000 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  le(pTrunk->pDbPa
20010 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
20020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20030 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
20040 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
20050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
20080 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
20090 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29  llback((*ppPage)
200a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
200b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
200c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
200d0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
200e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
200f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
20110 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20120 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
20130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
20150 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
20160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20170 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20180 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
20190 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
201a0 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
201b0 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
201c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
201d0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
201e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
201f0 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
20200 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
20210 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
20220 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
20230 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
20240 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
20250 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20   *pPgno = nPage 
20260 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
20270 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20280 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
20290 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
202a0 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63    /* An incr-vac
202b0 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  uum has already 
202c0 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  run within this 
202d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
202e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
202f0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73  e to allocate is
20300 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68   not from the ph
20310 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68  ysical end of th
20320 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20  e file, but.    
20330 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72    ** at pBt->nTr
20340 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  unc. .      */. 
20350 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42       *pPgno = pB
20360 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20  t->nTrunc+1;.   
20370 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
20380 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20390 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
203a0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
203b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
203c0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
203d0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
203e0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
203f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
20400 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
20410 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
20420 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
20430 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
20440 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
20450 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
20460 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
20470 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
20480 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
20490 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
204a0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
204b0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
204c0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
204d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
204e0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
204f0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
20500 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
20510 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
20520 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
20530 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
20540 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20550 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50  t) );.      (*pP
20560 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  gno)++;.      if
20570 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
20580 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20590 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20   ){ (*pPgno)++; 
205a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
205b0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
205c0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63       pBt->nTrunc
205d0 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d   = *pPgno;.    }
205e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
205f0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
20600 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20610 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
20620 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
20630 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
20640 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
20650 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
20660 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
20670 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20680 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
20690 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
206a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
206b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
206c0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
206d0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
206e0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
206f0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
20700 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
20710 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
20720 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20730 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
20740 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
20750 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
20760 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
20770 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
20780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20790 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
207a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
207b0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
207c0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
207d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
207e0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
207f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20800 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20810 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
20820 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
20830 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20840 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
20850 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
20860 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
20870 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
20880 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20890 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
208a0 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
208b0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
208c0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
208d0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
208e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
208f0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
20900 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
20910 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
20920 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
20930 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
20940 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
20950 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
20960 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
20970 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
20980 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
20990 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
209a0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 0a 20 20  >isInit = 0;..  
209b0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
209c0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
209d0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
209e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
209f0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
20a00 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
20a10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20a20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
20a30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20a40 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
20a50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20a60 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
20a70 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
20a80 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
20a90 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
20aa0 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
20ab0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
20ac0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
20ad0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
20ae0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
20af0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
20b00 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
20b10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20b20 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20b30 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
20b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
20b50 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
20b60 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
20b70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
20b80 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
20b90 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
20ba0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
20bb0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
20bc0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
20bd0 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
20be0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
20bf0 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
20c00 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
20c10 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  M ){.    rc = pt
20c20 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
20c30 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
20c40 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
20c50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20c60 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
20c70 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
20c80 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
20c90 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
20ca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20cb0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20cc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20cd0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20ce0 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  rc;.    memset(p
20cf0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
20d00 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  8);.    put4byte
20d10 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20d20 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
20d30 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46  );.    TRACE(("F
20d40 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72  REE-PAGE: %d fir
20d50 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  st\n", pPage->pg
20d60 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
20d70 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65     /* Other free
20d80 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65   pages already e
20d90 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74  xist.  Retrive t
20da0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  he first trunk p
20db0 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  age.    ** of th
20dc0 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66  e freelist and f
20dd0 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ind out how many
20de0 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20   leaves it has. 
20df0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
20e00 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d  pTrunk;.    rc =
20e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
20e20 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
20e30 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20e40 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c  a[32]), &pTrunk,
20e50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20e60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
20e70 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
20e80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
20e90 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
20ea0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
20eb0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
20ec0 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
20ed0 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
20ee0 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
20ef0 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
20f00 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
20f10 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20 20 20   no leaves..    
20f20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
20f30 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
20f40 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
20f50 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
20f60 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
20f70 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
20f80 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
20f90 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
20fa0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
20fb0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
20fc0 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
20fd0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
20fe0 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
20ff0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
21000 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
21010 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
21020 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
21030 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
21040 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
21050 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
21060 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
21070 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
21080 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
21090 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
210a0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
210b0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
210c0 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
210d0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
210e0 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
210f0 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
21100 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21110 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
21120 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
21130 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
21140 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
21150 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
21160 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
21170 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
21180 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
21190 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
211a0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
211b0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
211c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
211d0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
211e0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
211f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
21200 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21210 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21220 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
21230 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
21240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21250 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
21260 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
21270 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
21280 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
21290 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
212a0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  4], 0);.        
212b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
212c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
212d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
212e0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
212f0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
21300 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
21310 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
21320 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
21330 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
21340 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
21350 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20    }else if( k<0 
21360 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
21370 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
21380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
21390 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
213a0 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
213b0 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
213c0 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
213d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
213e0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
213f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
21420 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
21430 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
21440 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
21450 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
21460 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
21470 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
21480 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
21490 45 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ETE.        rc =
214a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
214b0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
214c0 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  bPage);.#endif. 
214d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
214e0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
214f0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
21500 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
21510 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
21520 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
21530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
21540 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runk);.  }.  ret
21550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21560 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
21570 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
21580 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
21590 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
215a0 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
215b0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
215c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
215d0 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
215e0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
215f0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
21600 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
21610 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
21620 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
21630 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a   int ovflPageSiz
21640 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
21650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21660 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
21670 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
21680 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21690 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
216a0 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
216b0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
216c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
216d0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
216e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
216f0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
21700 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
21710 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
21720 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
21730 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
21740 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69  ]);.  ovflPageSi
21750 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
21760 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
21770 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
21780 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
21790 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
217a0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
217b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
217c0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
217d0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
217e0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d  nOvfl-- ){.    M
217f0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20  emPage *pOvfl;. 
21800 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d     if( ovflPgno=
21810 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70  =0 || ovflPgno>p
21820 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
21830 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
21840 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21850 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
21860 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
21870 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
21880 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
21890 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
218a0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
218b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
218c0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
218d0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
218e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
218f0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
21900 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
21910 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
21920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
21940 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
21950 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
21960 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
21970 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
21980 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
21990 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
219a0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
219b0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
219c0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
219d0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
219e0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
219f0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
21a00 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
21a10 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
21a20 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
21a30 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
21a40 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
21a50 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
21a60 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
21a70 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
21a80 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21a90 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
21aa0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
21ab0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
21ac0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
21ad0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
21ae0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
21af0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
21b00 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
21b10 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
21b20 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
21b30 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
21b40 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
21b50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b70 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
21b80 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
21b90 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
21ba0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
21bb0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
21bc0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
21bd0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
21be0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
21bf0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
21c00 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
21c10 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
21c20 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
21c30 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
21c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c50 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
21c60 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
21c70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
21c80 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
21cb0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
21cc0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
21cd0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
21ce0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
21cf0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
21d00 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
21d10 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
21d20 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
21d30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
21d40 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
21d50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21d60 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
21d70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
21d80 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
21d90 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
21da0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
21db0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
21dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21dd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
21de0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
21df0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
21e00 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
21e10 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
21e20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
21e30 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
21e40 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
21e50 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
21e60 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
21e70 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
21e80 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
21e90 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
21ea0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
21eb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
21ec0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
21ed0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
21ee0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
21ef0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
21f00 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
21f10 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
21f20 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
21f30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
21f40 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
21f50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
21f60 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
21f70 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21f80 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
21f90 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
21fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
21fb0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
21fc0 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
21fd0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
21fe0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
21ff0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c  4*)&nKey);.  sql
22000 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
22010 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
22020 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
22030 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
22040 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
22050 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
22060 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
22070 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
22080 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
22090 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
220a0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
220b0 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
220c0 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
220d0 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
220e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
220f0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
22100 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
22110 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
22120 65 6c 73 65 7b 20 0a 20 20 20 20 2f 2a 20 54 42  else{ .    /* TB
22130 44 3a 20 20 50 65 72 68 61 70 73 20 72 61 69 73  D:  Perhaps rais
22140 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
22150 20 69 66 20 6e 4b 65 79 20 69 73 20 6c 61 72 67   if nKey is larg
22160 65 72 20 74 68 61 6e 20 33 31 20 62 69 74 73 3f  er than 31 bits?
22170 20 2a 2f 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   */.    nPayload
22180 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
22190 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
221a0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
221b0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
221c0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
221d0 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
221e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
221f0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
22200 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
22210 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
22220 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
22230 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
22240 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
22250 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
22260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22270 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
22280 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
22290 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
222a0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
222b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
222c0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
222d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
222e0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
222f0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
22300 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
22310 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
22320 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
22330 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
22340 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
22350 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22360 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
22370 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
22380 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
22390 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
223a0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
223b0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
223c0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
223d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
223e0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
223f0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
22400 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
22410 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
22420 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
22430 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
22440 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
22450 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
22460 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
22470 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
22480 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
22490 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
224a0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
224b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
224c0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
224d0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
224e0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
224f0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
22500 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
22510 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
22520 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
22530 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
22540 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
22550 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
22560 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
22570 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
22580 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
22590 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
225a0 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
225b0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
225c0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
225d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
225e0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
225f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
22600 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
22610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22620 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
22630 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
22640 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
22650 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
22660 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
22670 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
22680 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
22690 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
226a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
226b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
226c0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
226d0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
226e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
226f0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
22700 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
22710 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22720 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
22730 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
22740 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
22750 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
22760 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
22770 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
22780 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
22790 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
227a0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
227b0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
227c0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
227d0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
227e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
227f0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
22800 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
22810 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
22820 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
22830 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
22840 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
22850 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
22860 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
22870 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
22880 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
22890 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
228a0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
228b0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
228c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
228d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
228e0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
228f0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
22900 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
22910 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
22920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22930 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
22940 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
22950 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
22960 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
22970 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
22980 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
22990 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
229a0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
229b0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
229c0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
229d0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
229e0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
229f0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
22a00 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
22a10 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
22a20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
22a30 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
22a40 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
22a50 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
22a60 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
22a70 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
22a80 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
22a90 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
22aa0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
22ab0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
22ac0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22ad0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
22ae0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
22af0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
22b00 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
22b10 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
22b20 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
22b30 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
22b40 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
22b50 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
22b60 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
22b70 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
22b80 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
22b90 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
22ba0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
22bb0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
22bc0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
22bd0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
22be0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
22bf0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
22c00 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
22c10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
22c20 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
22c30 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
22c40 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
22c50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
22c60 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
22c70 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
22c80 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
22c90 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
22ca0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
22cb0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
22cc0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
22cd0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
22ce0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
22cf0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
22d00 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
22d10 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
22d20 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
22d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22d40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
22d50 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
22d60 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
22d70 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
22d80 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
22d90 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22da0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
22db0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
22dc0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
22dd0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
22de0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
22df0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
22e00 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
22e10 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
22e20 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
22e30 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
22e40 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
22e50 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
22e60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
22e70 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
22e80 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43  static int dropC
22e90 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
22ea0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
22eb0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
22ec0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22ed0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
22ee0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
22ef0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
22f00 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
22f10 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
22f20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
22f30 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
22f40 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
22f50 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
22f60 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
22f70 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
22f80 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
22f90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
22fa0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
22fb0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
22fc0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
22fd0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
22fe0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
22ff0 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
23000 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
23010 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
23020 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
23030 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23040 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
23050 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23060 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
23070 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
23080 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
23090 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
230a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
230b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28  byte(ptr);.  if(
230c0 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f   (pc<pPage->hdrO
230d0 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
230e0 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20  leaf?0:4)).     
230f0 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d  || (pc+sz>pPage-
23100 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
23110 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
23120 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
23130 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
23140 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
23150 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
23160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23170 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23180 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
23190 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
231a0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
231b0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
231c0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
231d0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
231e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
231f0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
23200 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
23210 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
23220 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
23230 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74  Free += 2;.  ret
23240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23250 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
23260 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
23270 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
23280 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
23290 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
232a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
232b0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
232c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
232d0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
232e0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
232f0 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
23300 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
23310 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
23320 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
23330 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
23340 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
23350 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
23360 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
23370 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
23380 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
23390 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
233a0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
233b0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
233c0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
233d0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
233e0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
233f0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
23400 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
23410 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
23420 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
23430 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
23440 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
23450 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
23460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
23470 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
23480 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
23490 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
234a0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
234b0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
234c0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
234d0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
234e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
234f0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
23500 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
23510 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
23520 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
23530 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
23540 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
23550 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
23560 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
23570 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
23580 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
23590 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
235a0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
235b0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
235c0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
235d0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
235e0 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
235f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
23600 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
23610 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
23620 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
23630 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
23640 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
23650 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
23660 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
23670 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
23680 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
23690 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
236a0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
236b0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
236c0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
236d0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
236e0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
236f0 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
23700 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
23710 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
23720 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
23730 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
23740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23750 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
23760 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
23770 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
23780 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
23790 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
237a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
237b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
237c0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
237d0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
237e0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
237f0 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
23800 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
23810 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
23820 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
23830 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
23840 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
23850 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
23860 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
23870 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
23880 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
23890 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
238a0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
238b0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
238c0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
238d0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
238e0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
238f0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
23900 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
23910 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
23920 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
23930 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
23940 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
23950 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
23960 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
23970 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
23980 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
23990 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
239a0 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
239b0 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
239c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
239d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
239e0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
239f0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
23a00 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
23a10 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
23a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
23a30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23a40 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
23a50 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
23a60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
23a70 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
23a80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
23a90 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
23aa0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
23ab0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
23ac0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
23ad0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
23ae0 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
23af0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
23b00 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
23b10 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
23b20 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
23b30 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
23b40 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
23b50 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
23b60 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
23b70 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
23b80 20 28 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61   (u16)i;.    pPa
23b90 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
23ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
23bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23bc0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
23bd0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
23be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23bf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23c10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
23c20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
23c30 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
23c40 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
23c50 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
23c60 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
23c70 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
23c80 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23c90 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
23ca0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
23cb0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
23cc0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
23cd0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
23ce0 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
23cf0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
23d00 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
23d10 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
23d20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
23d30 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
23d40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
23d70 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67   }.      top = g
23d80 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
23d90 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
23da0 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
23db0 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
23dc0 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
23dd0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
23de0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
23df0 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
23e00 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
23e10 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
23e20 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b   );.    if (idx+
23e30 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
23e40 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20  >usableSize) {. 
23e50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23e60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23e70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
23e80 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
23e90 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
23ea0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
23eb0 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
23ec0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
23ed0 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
23ee0 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
23ef0 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
23f00 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
23f10 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
23f20 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
23f30 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
23f40 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
23f50 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
23f60 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
23f70 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
23f80 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
23f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23fa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
23fb0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
23fc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23fd0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
23fe0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
23ff0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
24000 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
24010 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
24020 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
24030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
24040 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
24050 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
24060 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
24070 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
24080 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
24090 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
240a0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73  &info);.      as
240b0 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
240c0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
240d0 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
240e0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
240f0 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f  .      if( (info
24100 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
24110 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
24120 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
24130 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
24140 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
24150 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
24160 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
24170 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
24180 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
24190 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
241a0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
241b0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
241c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
241d0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
241e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
241f0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
24200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24210 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
24220 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
24230 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
24240 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
24250 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
24260 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
24270 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
24280 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
24290 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
242a0 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
242b0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
242c0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
242d0 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
242e0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
242f0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
24300 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
24310 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
24320 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
24330 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
24340 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
24350 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
24360 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
24370 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
24380 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
24390 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
243a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
243b0 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54  talSize;    /* T
243c0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  otal size of all
243d0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20   cells */.  int 
243e0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
243f0 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68   Index of page h
24400 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
24410 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20  ellptr;      /* 
24420 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
24430 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
24440 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
24450 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
24460 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
24470 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
24480 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
24490 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
244a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
244b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
244c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
244d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
244e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
244f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
24500 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
24510 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
24520 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
24530 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
24540 36 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  60 );.  totalSiz
24550 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
24560 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
24570 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
24580 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
24590 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
245a0 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
245b0 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
245c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
245d0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
245e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
245f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
24600 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
24610 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
24620 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
24630 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
24640 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
24650 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
24660 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
24670 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
24680 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
24690 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
246a0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
246b0 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
246c0 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
246d0 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
246e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
246f0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
24700 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
24710 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
24720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
24730 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
24740 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
24750 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
24760 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
24770 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
24780 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
24790 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
247a0 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
247b0 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
247c0 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
247d0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
247e0 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
247f0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
24800 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
24810 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
24820 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
24830 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
24840 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
24850 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
24860 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
24870 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
24880 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
24890 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
248a0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
248b0 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
248c0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
248d0 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
248e0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
248f0 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
24900 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
24910 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
24920 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
24930 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
24940 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
24950 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
24960 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
24970 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
24980 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
24990 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
249a0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
249b0 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
249c0 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
249d0 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
249e0 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
249f0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
24a00 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
24a10 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
24a20 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
24a30 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
24a40 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
24a50 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
24a60 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
24a70 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
24a80 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
24a90 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
24aa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
24ab0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
24ac0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
24ad0 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
24ae0 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
24af0 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
24b00 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
24b10 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
24b20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
24b30 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
24b40 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b  BtCursor*, int);
24b50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24b60 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
24b70 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
24b80 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
24b90 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
24ba0 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
24bb0 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
24bc0 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
24bd0 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
24be0 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
24bf0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
24c00 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
24c10 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
24c20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
24c30 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
24c40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
24c50 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
24c60 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61  d of trying bala
24c70 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
24c80 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
24c90 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
24ca0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
24cb0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
24cc0 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
24cd0 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
24ce0 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
24cf0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
24d00 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
24d10 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
24d20 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
24d30 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
24d40 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
24d50 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
24d60 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
24d70 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
24d80 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
24d90 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
24da0 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
24db0 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
24dc0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
24dd0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
24de0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24df0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
24e00 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
24e10 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
24e20 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
24e30 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
24e40 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
24e50 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
24e60 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
24e70 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
24e80 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
24e90 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ick(BtCursor *pC
24ea0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
24eb0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
24ec0 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   0;.  Pgno pgnoN
24ed0 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
24ee0 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20  .  u16 szCell;. 
24ef0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
24f00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24f10 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
24f30 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
24f40 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24f50 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
24f60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
24f70 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
24f80 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
24f90 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
24fa0 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
24fb0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
24fc0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
24fd0 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
24fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24ff0 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
25000 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
25010 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25030 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
25040 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
25050 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
25060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25070 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
25080 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ex) );..  /* All
25090 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
250a0 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
250b0 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
250c0 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
250d0 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
250e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
250f0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
25100 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
25110 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
25120 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
25130 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
25140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25150 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67      pCell = pPag
25160 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
25170 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20  l;.    szCell = 
25180 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
25190 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61  e, pCell);.    a
251a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
251b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
251c0 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
251d0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
251e0 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
251f0 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  [0]);.    assemb
25200 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
25210 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
25220 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
25230 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20  erflow = 0;.  . 
25240 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63     /* pPage is c
25250 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67  urrently the rig
25260 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72  ht-child of pPar
25270 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73  ent. Change this
25280 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
25290 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
252a0 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
252b0 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
252c0 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65  and.    ** pPage
252d0 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
252e0 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
252f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f    **.    ** Igno
25300 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  re the return va
25310 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20  lue of the call 
25320 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e  to fillInCell().
25330 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20   fillInCell().  
25340 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65    ** may only re
25350 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  turn other than 
25360 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20  SQLITE_OK if it 
25370 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  is required to a
25380 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f  llocate.    ** o
25390 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
253a0 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65  low pages. Since
253b0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62   an internal tab
253c0 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a  le B-Tree cell .
253d0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72      ** may never
253e0 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f   spill over onto
253f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25400 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d  e (it is a maxim
25410 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33  um of .    ** 13
25420 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c   bytes in size),
25430 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65   it is not necce
25440 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74  ssary to check t
25450 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  he return code..
25460 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69      **.    ** Si
25470 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73  milarly, the ins
25480 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69  ertCell() functi
25490 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  on cannot fail i
254a0 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  f the page.    *
254b0 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  * being inserted
254c0 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79   into is already
254d0 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68   writable and th
254e0 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
254f0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  .    ** contain 
25500 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e  an overflow poin
25510 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  ter. So ignore t
25520 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20  his return code 
25530 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
25540 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
25550 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43  Cell>0 );.    pC
25560 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
25570 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
25580 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ll-1);.    sqlit
25590 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
255a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
255b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69  , &info);.    fi
255c0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
255d0 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c  , parentCell, 0,
255e0 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
255f0 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65  , 0, &parentSize
25600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25610 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
25620 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
25630 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
25640 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
25650 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73  Page) );.    ins
25660 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
25670 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65   parentIdx, pare
25680 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69  ntCell, parentSi
25690 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70  ze, 0, 4);.    p
256a0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
256b0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
256c0 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61  ,parentIdx), pPa
256d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ge->pgno);.    p
256e0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
256f0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
25700 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
25710 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
25720 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
25730 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
25740 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
25750 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
25760 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
25770 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
25780 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
25790 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
257a0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
257b0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
257c0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a  flow page..    *
257d0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
257e0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
257f0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
25800 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
25810 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
25820 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt->pgno);.     
25830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
25850 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
25860 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20  (pNew, 0);.     
25870 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25880 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
25890 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
258a0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
258b0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
258c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
258d0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50  his point the pP
258e0 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61  age->nFree varia
258f0 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63  ble is not set c
25900 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20  orrectly with.  
25910 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74 68  ** respect to th
25920 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
25930 20 70 61 67 65 20 28 62 65 63 61 75 73 65 20 69   page (because i
25940 74 20 77 61 73 20 73 65 74 20 74 6f 20 30 20 62  t was set to 0 b
25950 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65  y .  ** insertCe
25960 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c  ll). So call sql
25970 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
25980 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  e() to make sure
25990 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72   it is.  ** corr
259a0 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ect..  **.  ** T
259b0 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f  his has to be do
259c0 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  ne even if an er
259d0 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
259e0 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  rned. Normally, 
259f0 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  if.  ** an error
25a00 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
25a10 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  ree balancing, t
25a20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d  he contents of M
25a30 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20  emPage are.  ** 
25a40 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61  not important, a
25a50 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72  s they will be r
25a60 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e  ecalculated when
25a70 20 74 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c   the page is rol
25a80 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42  led.  ** back. B
25a90 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61  ut here, in bala
25aa0 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20  nce_quick(), it 
25ab0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
25ac0 20 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a   pPage has .  **
25ad0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61   not yet been ma
25ae0 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77 72  rked dirty or wr
25af0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
25b00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
25b10 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77  refore.  ** it w
25b20 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65  ill not be rolle
25b30 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74  d back and so it
25b40 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
25b50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
25b60 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61    ** the page da
25b70 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20  ta and contents 
25b80 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63  of MemPage are c
25b90 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  onsistent..  */.
25ba0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
25bb0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
25bc0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
25bd0 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65  e);..  /* If eve
25be0 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63  rything else suc
25bf0 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20  ceeded, balance 
25c00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
25c10 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74   in .  ** case t
25c20 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
25c30 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
25c40 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
25c50 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  rfull..  */.  if
25c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25c70 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
25c80 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70  ge(pPage);.    p
25c90 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
25ca0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
25cb0 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Cur, 0);.  }.  r
25cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
25cd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
25ce0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
25cf0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
25d00 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
25d10 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
25d20 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
25d30 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
25d40 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
25d50 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
25d60 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
25d70 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
25d80 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
25d90 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
25da0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
25db0 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
25dc0 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
25dd0 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
25de0 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
25df0 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
25e00 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
25e10 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
25e20 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
25e30 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
25e40 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
25e50 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
25e60 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
25e70 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
25e80 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
25e90 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
25ea0 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
25eb0 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
25ec0 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
25ed0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
25ee0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
25ef0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
25f00 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
25f10 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
25f20 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
25f30 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
25f40 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
25f50 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
25f60 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
25f70 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
25f80 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
25f90 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
25fa0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
25fb0 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
25fc0 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
25fd0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
25fe0 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
25ff0 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
26000 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
26010 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
26020 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
26030 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
26040 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
26050 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
26060 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
26070 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
26080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26090 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
260a0 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
260b0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
260c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
260d0 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
260e0 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
260f0 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
26100 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
26110 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
26120 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
26130 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
26140 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
26150 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
26160 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
26170 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
26180 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
26190 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
261a0 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
261b0 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
261c0 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
261d0 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
261e0 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
261f0 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
26200 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
26210 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
26220 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
26230 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
26240 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
26250 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
26260 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
26270 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
26280 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
26290 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
262a0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
262b0 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
262c0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
262d0 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
262e0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
262f0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
26300 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26310 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
26320 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
26330 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72 20   /* The over or 
26340 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20 74  underfull page t
26350 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d  o balance */.  M
26360 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
26370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26380 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
26390 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
263a0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
263b0 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
263c0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
263d0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263f0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
26400 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
26410 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
26420 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
26430 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
26440 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
26450 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
26460 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
26470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26480 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
26490 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
264a0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
264b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
264c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
264d0 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
264e0 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
264f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26500 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
26510 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
26520 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
26530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26540 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
26550 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26570 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
26580 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
26590 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
265a0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
265b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
265c0 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
265d0 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
265e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
26610 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
26620 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
26630 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
26640 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
26650 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
26660 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
26670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26680 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
26690 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
266a0 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
266b0 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
266c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
266d0 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
266e0 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
266f0 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
26700 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
26710 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
26720 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
26730 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
26760 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
26770 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
26780 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20  nt iSpace1 = 0; 
26790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
267a0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
267b0 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f   of aSpace1[] */
267c0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d  .  int iSpace2 =
267d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
267e0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
267f0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b  byte of aSpace2[
26800 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
26810 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
26820 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
26830 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
26840 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
26850 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
26860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
26870 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
26880 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
26890 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
268a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
268b0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
268c0 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
268d0 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
268e0 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
268f0 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
26900 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
26910 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
26920 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
26930 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
26940 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
26950 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
26960 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
26970 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
26980 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
26990 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
269a0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
269b0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
269c0 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
269d0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
269e0 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
269f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
26a00 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
26a10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
26a20 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
26a30 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
26a40 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
26a50 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
26a60 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
26a70 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
26a80 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
26a90 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
26aa0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
26ab0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
26ac0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
26ad0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
26b00 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
26b10 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
26b20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
26b30 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
26b40 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
26b50 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
26b60 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
26b70 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
26b80 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
26b90 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f  iders cells befo
26ba0 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  re balance */.  
26bb0 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b  u8 *aSpace2 = 0;
26bc0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
26bd0 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76  for overflow div
26be0 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65  iders cells afte
26bf0 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  r balance */.  u
26c00 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20  8 *aFrom = 0;.. 
26c10 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
26c20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26c30 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e];.  assert( sq
26c40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26c50 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
26c60 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ex) );.  VVA_ONL
26c70 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
26c80 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a 20  uffled = 1 );.. 
26c90 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74   /* .  ** Find t
26ca0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
26cb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
26cc0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
26cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26ce0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
26cf0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
26d00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
26d10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
26d20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
26d30 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
26d40 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
26d50 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
26d60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26d70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  1];.  assert( pP
26d80 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53  arent );.  if( S
26d90 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
26da0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26db0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
26dc0 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ge)) ){.    retu
26dd0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 54 52  rn rc;.  }..  TR
26de0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
26df0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
26e00 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
26e10 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
26e20 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
26e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26e40 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
26e50 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
26e60 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
26e70 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
26e80 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
26e90 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
26ea0 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
26eb0 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
26ec0 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
26ed0 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
26ee0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
26ef0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
26f00 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
26f10 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
26f20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
26f30 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
26f40 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
26f50 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
26f60 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
26f70 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
26f80 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
26f90 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
26fa0 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
26fb0 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
26fc0 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
26fd0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
26fe0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
26ff0 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
27000 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
27010 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
27020 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20  low==1 &&.      
27030 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
27040 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
27050 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 72 65  l &&.      pPare
27060 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
27070 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
27080 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
27090 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
270a0 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
270b0 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  o.  ){.    asser
270c0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
270d0 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   );.    /*.    *
270e0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
270f0 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
27100 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
27110 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
27120 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
27130 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
27140 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
27150 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
27160 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
27170 71 75 69 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d  quick(pCur);.  }
27180 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53  .#endif..  if( S
27190 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
271a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
271b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
271c0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
271d0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   rc;.  }..  /*. 
271e0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c   ** Find the cel
271f0 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  l in the parent 
27200 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20  page whose left 
27210 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63  child points bac
27220 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e  k.  ** to pPage.
27230 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69    The "idx" vari
27240 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65  able is the inde
27250 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20  x of that cell. 
27260 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69   If pPage.  ** i
27270 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  s the rightmost 
27280 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
27290 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f   then set idx to
272a0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
272b0 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43  .  */.  idx = pC
272c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
272d0 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65  iPage-1];.  asse
272e0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 70 50  rtParentIndex(pP
272f0 61 72 65 6e 74 2c 20 69 64 78 2c 20 70 50 61 67  arent, idx, pPag
27300 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  e->pgno);..  /*.
27310 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
27320 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61  variables so tha
27330 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66  t it will be saf
27340 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64  e to jump.  ** d
27350 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e  irectly to balan
27360 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e  ce_cleanup at an
27370 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  y moment..  */. 
27380 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30   nOld = nNew = 0
27390 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
273a0 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
273b0 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
273c0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
273d0 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
273e0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
273f0 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
27400 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
27410 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
27420 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
27430 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
27440 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
27450 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
27460 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
27470 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
27480 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
27490 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
274a0 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
274b0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
274c0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
274d0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
274e0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
274f0 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
27500 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
27510 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
27520 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
27530 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
27540 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
27550 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
27560 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
27570 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
27580 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
27590 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
275a0 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
275b0 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
275c0 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
275d0 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
275e0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
275f0 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
27600 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
27610 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
27620 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
27630 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
27640 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
27650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
27660 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
27670 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
27680 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
27690 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
276a0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
276b0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
276c0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
276d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
276e0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
276f0 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
27700 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
27710 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
27720 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27730 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64   /* apOld[i]->id
27740 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a  xParent = k; */.
27750 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
27760 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
27770 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
27780 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
27790 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
277a0 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
277b0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
277c0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
277d0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
277e0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
277f0 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
27800 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
27810 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
27820 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
27830 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
27840 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
27850 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
27860 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a  ctures.  */.  sz
27870 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
27880 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
27890 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278b0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
278c0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
278d0 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278f0 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
27900 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28   (ROUND8(sizeof(
27910 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70  MemPage))+pBt->p
27920 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20  ageSize)*NB  /* 
27930 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20  aCopy */.     + 
27940 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
27970 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
27980 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
27990 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b   nMaxCells : 0);
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
279b0 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c  aFrom */.  apCel
279c0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
279d0 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
279e0 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
279f0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
27a00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27a10 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
27a20 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
27a30 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
27a40 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
27a50 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
27a60 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
27a70 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
27a80 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
27a90 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d  - (u8*)0) & 7)==
27aa0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
27ab0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
27ac0 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20  d */.  for(i=1; 
27ad0 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
27ae0 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
27af0 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
27b00 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
27b10 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
27b20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
27b30 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29 20  py[i] - (u8*)0) 
27b40 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
27b50 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
27b60 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
27b70 20 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70   aSpace1 = &aCop
27b80 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  y[NB-1][pBt->pag
27b90 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
27ba0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
27bb0 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61    assert( ((aSpa
27bc0 63 65 31 20 2d 20 28 75 38 2a 29 30 29 20 26 20  ce1 - (u8*)0) & 
27bd0 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
27be0 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
27bf0 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 49  uired */.  if( I
27c00 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
27c10 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61     aFrom = &aSpa
27c20 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
27c30 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61 63 65  e];.  }.  aSpace
27c40 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  2 = sqlite3PageM
27c50 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53  alloc(pBt->pageS
27c60 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70 61  ize);.  if( aSpa
27c70 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ce2==0 ){.    rc
27c80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
27c90 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
27ca0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
27cb0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
27cc0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
27cd0 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
27ce0 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
27cf0 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
27d00 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
27d10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
27d20 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
27d30 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
27d40 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
27d50 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
27d60 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
27d70 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
27d80 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
27d90 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
27da0 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
27db0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
27dc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
27dd0 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
27de0 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61  i] = (MemPage*)a
27df0 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d  Copy[i];.    mem
27e00 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c  cpy(p, apOld[i],
27e10 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
27e20 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  );.    p->aData 
27e30 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a  = (void*)&p[1];.
27e40 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44      memcpy(p->aD
27e50 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
27e60 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
27e70 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize);.  }..  /*.
27e80 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
27e90 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
27ea0 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
27eb0 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
27ec0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
27ed0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
27ee0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
27ef0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
27f00 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
27f10 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
27f20 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63  ained form aSpac
27f30 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
27f40 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20  the the divider 
27f50 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  Cells.  ** from 
27f60 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  pParent..  **.  
27f70 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  ** If the siblin
27f80 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70  gs are on leaf p
27f90 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ages, then the c
27fa0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66  hild pointers of
27fb0 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65   the.  ** divide
27fc0 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69  r cells are stri
27fd0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65  pped from the ce
27fe0 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  lls before they 
27ff0 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20  are copied.  ** 
28000 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20  into aSpace1[]. 
28010 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
28020 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
28030 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
28040 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
28050 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
28060 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
28070 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
28080 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
28090 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
280a0 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
280b0 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
280c0 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
280d0 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
280e0 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
280f0 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
28100 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
28110 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
28120 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
28130 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
28140 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
28150 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
28160 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
28170 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
28180 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
28190 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
281a0 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
281b0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68 61 73  ata = pPage->has
281c0 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
281d0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
281e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
281f0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
28200 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
28210 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
28220 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
28230 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
28240 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
28250 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
28260 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
28270 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
28280 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
28290 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
282a0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
282b0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
282c0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
282d0 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
282e0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
282f0 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20     int a;.      
28300 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
28310 20 28 75 38 29 69 3b 20 20 20 61 73 73 65 72 74   (u8)i;   assert
28320 28 20 69 3e 3d 30 20 26 26 20 69 3c 36 20 29 3b  ( i>=0 && i<6 );
28330 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
28340 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
28350 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
28360 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
28370 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
28380 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
28390 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
283a0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
283b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
283c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
283d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
283e0 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  }.      nCell++;
283f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
28400 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20  <nOld-1 ){.     
28410 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69   u16 sz = cellSi
28420 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
28430 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
28440 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
28450 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20          /* With 
28460 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61  the LEAFDATA fla
28470 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73  g, pParent cells
28480 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45   hold only INTKE
28490 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  Ys that.        
284a0 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ** are duplicate
284b0 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65  s of keys on the
284c0 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57   child pages.  W
284d0 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65  e need to remove
284e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
284f0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
28500 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20  om pParent, but 
28510 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65 6c  the dividers cel
28520 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20  ls are not.     
28530 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61     ** added to a
28540 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20  pCell[] because 
28550 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63 61  they are duplica
28560 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c  tes of child cel
28570 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
28580 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
28590 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
285a0 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sz);.      }else
285b0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 54  {.        u8 *pT
285c0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  emp;.        ass
285d0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
285e0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
285f0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
28600 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  sz;.        pTem
28610 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
28620 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  ace1];.        i
28630 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
28640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
28650 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
28660 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  4 );.        ass
28670 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42  ert( iSpace1<=pB
28680 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
28690 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
286a0 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
286b0 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65  z);.        apCe
286c0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
286d0 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
286e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
286f0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
28700 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
28710 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
28720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
28730 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
28740 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
28750 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
28760 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c  fCorrection==0 |
28770 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  | leafCorrection
28780 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==4 );.        s
28790 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
287a0 28 75 31 36 29 6c 65 61 66 43 6f 72 72 65 63 74  (u16)leafCorrect
287b0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ion;.        ass
287c0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54  ert( get4byte(pT
287d0 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d  emp)==pgnoOld[i]
287e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
287f0 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
28800 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28810 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
28820 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
28830 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
28840 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
28850 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
28860 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
28870 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
28880 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
28890 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
288a0 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c     memcpy(apCell
288b0 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e  [nCell], &pOld->
288c0 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f  aData[pOld->hdrO
288d0 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20  ffset+8], 4);.  
288e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
288f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
28900 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
28910 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
28920 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
28930 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
28940 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
28950 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
28960 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
28970 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28980 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
28990 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
289a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
289b0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
289c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
289d0 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
289e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
289f0 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
28a00 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
28a10 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
28a20 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
28a30 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
28a40 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
28a50 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
28a60 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
28a70 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
28a80 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
28a90 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
28aa0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
28ab0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
28ac0 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
28ad0 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
28ae0 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
28af0 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
28b00 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
28b10 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
28b20 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
28b30 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
28b40 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
28b50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
28b60 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
28b70 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
28b80 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
28b90 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
28ba0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
28bb0 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
28bc0 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
28bd0 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
28be0 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
28c00 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
28c10 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
28c20 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
28c30 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
28c40 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
28c50 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
28c60 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
28c70 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
28c80 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
28c90 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
28ca0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
28cb0 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
28cc0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
28cd0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
28ce0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
28cf0 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
28d00 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
28d10 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
28d20 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
28d30 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
28d40 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
28d50 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
28d60 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
28d70 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
28d80 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
28d90 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
28da0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  +;.    }.  }.  s
28db0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
28dc0 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
28dd0 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
28de0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
28df0 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
28e00 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
28e10 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
28e20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
28e30 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
28e40 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
28e50 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
28e60 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
28e70 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
28e80 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
28e90 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
28ea0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
28eb0 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
28ec0 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
28ed0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
28ee0 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
28ef0 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
28f00 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
28f10 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
28f20 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
28f30 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
28f40 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
28f50 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
28f60 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
28f70 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
28f80 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
28f90 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
28fa0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
28fb0 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
28fc0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
28fd0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
28fe0 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
28ff0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
29000 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
29010 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
29020 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
29030 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
29040 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
29050 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
29060 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
29070 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
29080 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
29090 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
290a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
290b0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
290c0 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
290d0 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
290e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
290f0 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
29100 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
29110 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
29120 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
29130 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
29140 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
29150 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
29160 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
29170 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
29180 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
29190 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
291a0 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
291b0 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
291c0 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
291d0 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
291e0 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
291f0 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
29200 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
29210 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
29220 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
29230 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
29240 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
29250 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
29260 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
29270 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
29280 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
29290 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
292a0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
292b0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
292c0 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
292d0 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a  r we are the.  *
292e0 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
292f0 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
29300 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
29310 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
29320 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
29330 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
29340 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
29350 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
29360 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
29370 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
29380 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
29390 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
293a0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  =0) );..  /*.  *
293b0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
293c0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
293d0 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
293e0 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
293f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
29400 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46  gno>1 );.  pageF
29410 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44  lags = pPage->aD
29420 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
29430 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
29440 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
29450 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
29460 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
29470 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
29480 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
29490 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b  ew[i] = pgnoOld[
294a0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
294b0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
294c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
294d0 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
294e0 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
294f0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
29500 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
29510 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
29520 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
29530 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
29540 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
29550 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
29560 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67   &pgnoNew[i], pg
29570 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a  noNew[i-1], 0);.
29580 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
29590 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
295a0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
295b0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
295c0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a    nNew++;.    }.
295d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
295e0 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
295f0 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
29600 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
29610 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
29620 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  nOld ){.    rc =
29630 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
29640 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
29650 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
29660 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
29670 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
29680 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
29690 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
296a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
296b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
296c0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
296d0 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
296e0 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
296f0 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
29700 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
29710 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
29720 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
29730 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
29740 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
29750 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
29760 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
29770 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
29780 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
29790 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
297a0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
297b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
297c0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
297d0 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
297e0 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
297f0 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
29800 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
29810 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
29820 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
29830 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
29840 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
29850 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
29860 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
29870 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
29880 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
29890 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
298a0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
298b0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
298c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
298d0 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
298e0 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e  int minV = pgnoN
298f0 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d  ew[i];.    int m
29900 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
29910 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
29920 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
29930 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65  oNew[j]<(unsigne
29940 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
29950 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
29960 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e      minV = pgnoN
29970 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  ew[j];.      }. 
29980 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
29990 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
299a0 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
299b0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
299c0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
299d0 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
299e0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
299f0 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e  i] = pgnoNew[min
29a00 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
29a10 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
29a20 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
29a30 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20  minI] = t;.     
29a40 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
29a50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
29a60 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29a70 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e  old: %d %d %d  n
29a80 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
29a90 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
29aa0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70  %d(%d)\n",.    p
29ab0 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20  gnoOld[0], .    
29ac0 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c  nOld>=2 ? pgnoOl
29ad0 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  d[1] : 0,.    nO
29ae0 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=3 ? pgnoOld[
29af0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f  2] : 0,.    pgno
29b00 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d  New[0], szNew[0]
29b10 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
29b20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20  pgnoNew[1] : 0, 
29b30 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
29b40 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
29b50 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d  >=3 ? pgnoNew[2]
29b60 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
29b70 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
29b80 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f    nNew>=4 ? pgno
29b90 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[3] : 0, nNew
29ba0 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
29bb0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
29bc0 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30  ? pgnoNew[4] : 0
29bd0 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
29be0 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f  w[4] : 0));..  /
29bf0 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
29c00 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
29c10 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
29c20 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
29c30 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
29c40 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
29c50 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
29c60 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
29c70 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
29c80 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
29c90 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
29ca0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
29cb0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
29cc0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
29cd0 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
29ce0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
29cf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
29d00 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65  ew->pgno==pgnoNe
29d10 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f  w[i] );.    zero
29d20 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
29d30 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
29d40 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
29d50 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
29d60 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
29d70 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
29d80 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
29d90 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
29da0 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
29db0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
29dc0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
29dd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
29de0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
29df0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
29e00 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
29e10 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
29e20 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
29e30 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61  the siblings tha
29e40 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65  t were rearrange
29e50 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a  d. These can be:
29e60 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69   left.    ** chi
29e70 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20  ldren of cells, 
29e80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
29e90 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
29ea0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
29eb0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f     ** pointed to
29ec0 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a   by cells..    *
29ed0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
29ee0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
29ef0 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65  for(k=j; k<cntNe
29f00 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  w[i]; k++){.    
29f10 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d      assert( k<nM
29f20 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
29f30 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d     if( aFrom[k]=
29f40 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
29f50 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[k]]->pgno!
29f60 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
29f70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
29f80 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
29f90 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20  , k-j);.        
29fa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29fb0 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65  _OK && leafCorre
29fc0 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
29fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29fe0 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
29ff0 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c  byte(apCell[k]),
2a000 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2a010 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
2a020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a030 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a050 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a060 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2a070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2a090 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
2a0a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2a0b0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
2a0c0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
2a0d0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
2a0e0 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
2a0f0 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
2a100 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
2a110 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2a120 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2a130 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65  <nNew-1 && j<nCe
2a140 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
2a150 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
2a160 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
2a170 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
2a180 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
2a190 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
2a1a0 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
2a1b0 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
2a1c0 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
2a1d0 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
2a1e0 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70 61 63  = &aSpace2[iSpac
2a1f0 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  e2];.      if( !
2a200 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
2a210 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2a220 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
2a230 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
2a240 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2a250 4d 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  M .         && (
2a260 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c  aFrom[j]==0xFF |
2a270 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a  | apCopy[aFrom[j
2a280 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
2a290 70 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b  pgno).        ){
2a2a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a2b0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2a2c0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
2a2d0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
2a2e0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
2a2f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a310 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2a320 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2a330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a340 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2a350 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
2a360 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2a370 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
2a380 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
2a390 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
2a3a0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
2a3b0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
2a3c0 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
2a3d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
2a3e0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
2a3f0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
2a400 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2a410 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
2a420 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
2a430 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
2a440 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
2a450 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
2a460 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
2a470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a480 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2a490 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
2a4a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2a4b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
2a4c0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
2a4d0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
2a4e0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2a4f0 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c        fillInCell
2a500 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c  (pParent, pCell,
2a510 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
2a520 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
2a530 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
2a540 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a550 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
2a560 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
2a570 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
2a580 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
2a590 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
2a5a0 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
2a5b0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
2a5c0 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
2a5d0 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
2a5e0 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
2a5f0 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
2a600 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
2a610 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
2a620 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
2a630 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
2a640 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
2a650 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
2a660 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
2a670 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
2a680 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
2a690 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
2a6a0 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
2a6b0 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
2a6c0 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
2a6d0 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
2a6e0 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
2a6f0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
2a700 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
2a710 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
2a720 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
2a730 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
2a740 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
2a750 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
2a760 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
2a770 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
2a780 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
2a790 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
2a7a0 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
2a7b0 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
2a7c0 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
2a7d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a7e0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
2a7f0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
2a800 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
2a810 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
2a820 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
2a830 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2a840 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
2a850 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a860 69 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20  iSpace2 += sz;. 
2a870 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2a880 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2a890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2a8a0 28 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e  ( iSpace2<=pBt->
2a8b0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2a8c0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2a8d0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2a8e0 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
2a8f0 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
2a900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a910 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2a920 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
2a930 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2a940 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2a950 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2a960 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
2a970 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2a980 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
2a990 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
2a9a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
2a9b0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2a9c0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e  uum database, an
2a9d0 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74  d not a leaf-dat
2a9e0 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a  a tree,.      **
2a9f0 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65   then update the
2aa00 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74   pointer map wit
2aa10 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  h an entry for t
2aa20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2aa30 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
2aa40 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73  he cell just ins
2aa50 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20  erted points to 
2aa60 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
2aa70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
2aa80 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65  UTOVACUUM && !le
2aa90 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
2aaa0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2aab0 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
2aac0 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
2aad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2aae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2aaf0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2ab00 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2ab10 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a     }.      j++;.
2ab20 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
2ab30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
2ab40 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2ab50 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
2ab60 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2ab70 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2ab80 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2ab90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2aba0 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
2abb0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2abc0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2abd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2abe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2abf0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2ac00 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2ac10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2ac20 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
2ac30 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
2ac40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
2ac50 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
2ac60 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
2ac70 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
2ac80 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
2ac90 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
2aca0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
2acb0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
2acc0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
2acd0 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ild, 4);.    if(
2ace0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2acf0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2ad00 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2ad10 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52  yte(zChild), PTR
2ad20 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
2ad30 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
2ad40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ad50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ad60 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2ad70 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2ad80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
2ad90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2ada0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2adb0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2adc0 29 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d  );.  if( nxDiv==
2add0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
2ade0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2adf0 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
2ae00 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
2ae10 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2ae20 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2ae30 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
2ae40 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2ae50 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2ae60 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2ae70 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
2ae80 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
2ae90 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2aea0 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
2aeb0 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
2aec0 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
2aed0 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
2aee0 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
2aef0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
2af00 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2af10 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
2af20 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
2af30 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
2af40 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63    /*.  ** Balanc
2af50 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2af60 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
2af70 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28  e current page (
2af80 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a  pPage) might.  *
2af90 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  * have been adde
2afa0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2afb0 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  t so it might no
2afc0 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69   longer be initi
2afd0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74  alized..  ** But
2afe0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2aff0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2b000 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2b010 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2b020 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ent->isInit );. 
2b030 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
2b040 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61  ree(apCell);.  a
2b050 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  pCell = 0;.  rel
2b060 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2b070 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
2b080 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
2b090 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20 20  (pCur, 0);.  .  
2b0a0 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
2b0b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2b0c0 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
2b0d0 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
2b0e0 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63 65  3PageFree(aSpace
2b0f0 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72  2);.  sqlite3Scr
2b100 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2b110 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2b120 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
2b130 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
2b140 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
2b150 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2b160 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2b170 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
2b180 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  }.  pPage->nOver
2b190 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  flow = 0;..  /* 
2b1a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
2b1b0 65 6e 74 29 3b 20 2a 2f 0a 20 20 54 52 41 43 45  ent); */.  TRACE
2b1c0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
2b1d0 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
2b1e0 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
2b1f0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
2b200 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
2b210 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
2b220 6c 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  l));..  return r
2b230 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2b240 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2b250 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
2b260 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
2b270 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
2b280 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2b290 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
2b2a0 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
2b2b0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
2b2c0 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
2b2d0 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
2b2e0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2b2f0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74 43  ce_shallower(BtC
2b300 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b310 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b330 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d 54  Root page of B-T
2b340 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2b350 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20   *pChild;       
2b360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
2b370 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20  y child page of 
2b380 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  pPage */.  Pgno 
2b390 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
2b3a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2b3b0 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c  number for pChil
2b3c0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
2b3d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2b3e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2b3f0 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
2b400 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61  dures */.  BtSha
2b410 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2b420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b430 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72  e main BTree str
2b440 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
2b450 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
2b460 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2b470 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
2b480 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a  lls per page */.
2b490 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b4b0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * All cells from
2b4c0 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
2b4d0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2b4e0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2b4f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2b500 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2b510 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ls */..  assert(
2b520 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2b530 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2b540 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20  r->apPage[0];.. 
2b550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b560 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2b570 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b580 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2b590 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2b5a0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2b5b0 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61  t;.  mxCellPerPa
2b5c0 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74  ge = MX_CELL(pBt
2b5d0 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  );.  apCell = sq
2b5e0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43  lite3Malloc( mxC
2b5f0 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
2b600 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
2b610 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
2b620 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2b630 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b640 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2b650 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
2b660 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
2b670 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b680 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
2b690 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
2b6a0 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
2b6b0 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
2b6c0 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
2b6d0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
2b6e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
2b6f0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2b700 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
2b710 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
2b720 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
2b730 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
2b740 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
2b750 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
2b760 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
2b770 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
2b780 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
2b790 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
2b7a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b7b0 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
2b7c0 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
2b7d0 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
2b7e0 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
2b7f0 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
2b800 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
2b810 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
2b820 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
2b830 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
2b840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
2b850 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
2b860 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
2b870 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
2b880 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2b890 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
2b8a0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
2b8b0 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
2b8c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
2b8d0 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
2b8e0 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
2b8f0 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
2b900 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
2b910 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
2b920 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
2b930 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2b940 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
2b950 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
2b960 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
2b970 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
2b980 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75     VVA_ONLY( pCu
2b990 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
2b9a0 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f   = 1 );.    pgno
2b9b0 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2b9c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2b9d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2b9e0 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
2b9f0 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
2ba00 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2ba10 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65  Child<=pagerPage
2ba20 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74  count(pPage->pBt
2ba30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
2ba40 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2ba50 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  e(pPage->pBt, pg
2ba60 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64  noChild, &pChild
2ba70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2ba80 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2ba90 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2baa0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f   if( pPage->pgno
2bab0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
2bac0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2bad0 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
2bae0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2baf0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2bb00 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61  balance;.      a
2bb10 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2bb20 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
2bb30 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d       if( pChild-
2bb40 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20  >nFree>=100 ){. 
2bb50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2bb60 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ild information 
2bb70 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2bb80 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f  root page, so do
2bb90 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2bba0 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  copy */.        
2bbb0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a  int i;.        z
2bbc0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2bbd0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29  Child->aData[0])
2bbe0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2bbf0 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
2bc00 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
2bc10 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20      apCell[i] = 
2bc20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c  findCell(pChild,
2bc30 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  i);.          sz
2bc40 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  Cell[i] = cellSi
2bc50 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70  zePtr(pChild, ap
2bc60 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Cell[i]);.      
2bc70 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2bc80 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20  mblePage(pPage, 
2bc90 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61  pChild->nCell, a
2bca0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a  pCell, szCell);.
2bcb0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
2bcc0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
2bcd0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74  r of the child t
2bce0 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
2bcf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bd00 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2bd10 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2bd20 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2bd30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2bd40 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2bd50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2bd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
2bd70 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61  4byte(&pChild->a
2bd80 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72  Data[pChild->hdr
2bd90 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2bda0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2bdb0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2bdc0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2bdd0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72  NCE: child %d tr
2bde0 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31  ansfer to page 1
2bdf0 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2be00 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  o));.      }else
2be10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2be20 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20   child has more 
2be30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
2be40 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2be50 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a   root..        *
2be60 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c  * The tree is al
2be70 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20  ready balanced. 
2be80 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   Do nothing. */.
2be90 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2bea0 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2beb0 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  d will not fit o
2bec0 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  n page 1\n", pCh
2bed0 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2bee0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2bef0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2bf00 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c  ge->aData, pChil
2bf10 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d  d->aData, pPage-
2bf20 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2bf30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
2bf40 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
2bf50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2bf60 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
2bf70 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
2bf80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bf90 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
2bfa0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2bfb0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2bfc0 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
2bfd0 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
2bfe0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2bff0 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
2c000 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2c010 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2c020 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c030 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ow==0 );.#ifndef
2c040 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c050 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2c060 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2c070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43  .      rc = setC
2c090 68 69 6c 64 50 74 72 6d 61 70 73 28 70 50 61 67  hildPtrmaps(pPag
2c0a0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
2c0b0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2c0c0 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e  (pChild);.  }.en
2c0d0 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2c0e0 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  e:.  sqlite3_fre
2c0f0 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e(apCell);.  ret
2c100 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2c110 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2c120 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a  is overfull.**.*
2c130 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70  * When this happ
2c140 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65  ens, Create a ne
2c150 77 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64  w child page and
2c160 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e   copy the.** con
2c170 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
2c180 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  t into the child
2c190 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65  .  Then make the
2c1a0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e   root.** page an
2c1b0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
2c1c0 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e   rightChild poin
2c1d0 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a  ting to the new.
2c1e0 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61  ** child.   Fina
2c1f0 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  lly, call balanc
2c200 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20  e_internal() on 
2c210 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a  the new child.**
2c220 20 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20   to cause it to 
2c230 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  split..*/.static
2c240 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
2c250 70 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  per(BtCursor *pC
2c260 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ur){.  int rc;  
2c270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2c280 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
2c290 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2c2a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c2b0 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
2c2c0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
2c2d0 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
2c2e0 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
2c2f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
2c300 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2c310 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
2c320 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2c330 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
2c340 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
2c350 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2c360 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
2c370 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
2c380 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
2c390 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
2c3a0 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
2c3b0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2c3c0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2c3d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c3e0 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
2c3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2c400 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
2c410 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2c420 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
2c430 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
2c440 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
2c450 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  nt */.  int cbrk
2c460 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2c470 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
2c480 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
2c490 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
2c4a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2c4b0 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
2c4c0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2c4d0 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  0]->nOverflow>0 
2c4e0 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  );..  VVA_ONLY( 
2c4f0 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
2c500 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 70 50 61  led = 1 );.  pPa
2c510 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2c520 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50  e[0];.  pBt = pP
2c530 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
2c540 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c550 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2c560 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2c570 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c580 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2c590 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 63 20  DbPage) );.  rc 
2c5a0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2c5b0 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
2c5c0 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
2c5d0 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
2c5e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2c5f0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
2c600 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2c610 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
2c620 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
2c630 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
2c640 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
2c650 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2c660 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2c670 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62  >hdrOffset;.  cb
2c680 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2c690 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2c6a0 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2c6b0 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2c6c0 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2c6d0 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2c6e0 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2c6f0 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2c700 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20  y(&cdata[cbrk], 
2c710 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
2c720 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a  bleSize-cbrk);..
2c730 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2c740 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
2c750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2c760 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2c770 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2c780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2c790 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67 65  nt nCopy = pPage
2c7a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2c7b0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2c7c0 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0]);.    memcpy(
2c7d0 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
2c7e0 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f  Page->aOvfl, nCo
2c7f0 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d  py);.    pChild-
2c800 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
2c810 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
2c820 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
2c830 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2c840 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2c850 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
2c860 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2c870 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2c880 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ll );.    assert
2c890 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2c8a0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c8b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2c8c0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2c8d0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2c8e0 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
2c8f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2c900 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2c910 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2c920 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
2c930 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2c940 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
2c950 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
2c960 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
2c970 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49  gno));.    if( I
2c980 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2c990 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2c9a0 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d  Put(pBt, pChild-
2c9b0 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2c9c0 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  REE, pPage->pgno
2c9d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2c9e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2c9f0 4d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  M.      if( rc==
2ca00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ca10 20 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69       rc = setChi
2ca20 6c 64 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64  ldPtrmaps(pChild
2ca30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2ca40 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  f.    }.  }..  i
2ca50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ca60 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50   ){.    pCur->iP
2ca70 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d  age++;.    pCur-
2ca80 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68  >apPage[1] = pCh
2ca90 69 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  ild;.    pCur->a
2caa0 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
2cab0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
2cac0 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  nroot(pCur);.  }
2cad0 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
2cae0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2caf0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2cb00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
2cb10 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
2cb20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
2cb30 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
2cb40 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
2cb50 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
2cb60 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
2cb70 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
2cb80 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
2cb90 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
2cba0 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
2cbb0 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
2cbc0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
2cbd0 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
2cbe0 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72  tine..** .** Par
2cbf0 61 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74 20  ameter isInsert 
2cc00 69 73 20 74 72 75 65 20 69 66 20 61 20 6e 65 77  is true if a new
2cc10 20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69   cell was just i
2cc20 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
2cc30 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c  .** page, or fal
2cc40 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
2cc50 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2cc60 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
2cc70 75 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74  ur, int isInsert
2cc80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2cc90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2cca0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2ccb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ccc0 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74  Page];..  assert
2ccd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2cce0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2ccf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2cd00 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2cd10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2cd20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2cd30 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2cd40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cd50 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2cd60 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
2cd70 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2cd80 5f 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20  _deeper(pCur);. 
2cd90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2cda0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2cdb0 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
2cdc0 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  K );.    }.    i
2cdd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cde0 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2cdf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2ce00 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
2ce10 77 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20  wer(pCur);.     
2ce20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ce30 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2ce40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2ce50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2ce60 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
2ce70 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
2ce80 20 20 20 20 20 20 20 28 21 69 73 49 6e 73 65 72         (!isInser
2ce90 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  t && pPage->nFre
2cea0 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  e>pPage->pBt->us
2ceb0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b  ableSize*2/3) ){
2cec0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2ced0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72  nce_nonroot(pCur
2cee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2cef0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2cf00 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  w==0 || rc!=SQLI
2cf10 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20  TE_OK );.    }. 
2cf20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2cf30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2cf40 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c  utine checks all
2cf50 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f   cursors that po
2cf60 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e  int to table pgn
2cf70 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79  oRoot..** If any
2cf80 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72   of those cursor
2cf90 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  s were opened wi
2cfa0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20  th wrFlag==0 in 
2cfb0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64  a different.** d
2cfc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2cfd0 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63  on (a database c
2cfe0 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73  onnection that s
2cff0 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a  hares the pager.
2d000 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68  ** cache with th
2d010 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63  e current connec
2d020 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f  tion) and that o
2d030 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2d040 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  .** is not in th
2d050 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74  e ReadUncommmitt
2d060 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ed state, then t
2d070 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2d080 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  rns .** SQLITE_L
2d090 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20  OCKED..**.** As 
2d0a0 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20  well as cursors 
2d0b0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20  with wrFlag==0, 
2d0c0 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2d0d0 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69  lag==1 and .** i
2d0e0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d  sIncrblobHandle=
2d0f0 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73  =1 are also cons
2d100 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75  idered 'read' cu
2d110 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74  rsors. Increment
2d120 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73  al .** blob curs
2d130 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ors are used for
2d140 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
2d150 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  d writing..**.**
2d160 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69   When pgnoRoot i
2d170 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
2d180 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  of an intkey tab
2d190 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
2d1a0 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73  n is also.** res
2d1b0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76  ponsible for inv
2d1c0 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d  alidating increm
2d1d0 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2d1e0 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  rs when the tabl
2d1f0 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63  e row.** on whic
2d200 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65  h they are opene
2d210 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20  d is deleted or 
2d220 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72  modified. Cursor
2d230 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
2d240 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74  d.** according t
2d250 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2d260 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  rules:.**.**   1
2d270 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61  ) When BtreeClea
2d280 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c  rTable() is call
2d290 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ed to completely
2d2a0 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
2d2b0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20  ents.**      of 
2d2c0 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20  a B-Tree table, 
2d2d0 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
2d2e0 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61  to zero and para
2d2f0 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a  meter iRow is .*
2d300 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f  *      set to no
2d310 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  n-zero. In this 
2d320 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65  case all increme
2d330 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2d340 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f  s open.**      o
2d350 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  n the table root
2d360 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61  ed at pgnoRoot a
2d370 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
2d380 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
2d390 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42  BtreeInsert(), B
2d3a0 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
2d3b0 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69  BtreePutData() i
2d3c0 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20  s called to .** 
2d3d0 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61       modify a ta
2d3e0 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53  ble row via an S
2d3f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45  QL statement, pE
2d400 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f  xclude is set to
2d410 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72   the .**      wr
2d420 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ite cursor used 
2d430 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69  to do the modifi
2d440 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d  cation and param
2d450 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74  eter iRow is set
2d460 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
2d470 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f  integer row id o
2d480 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74  f the B-Tree ent
2d490 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ry being modifie
2d4a0 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20  d. Unless.**    
2d4b0 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74    pExclude is it
2d4c0 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  self an incremen
2d4d0 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c  tal blob cursor,
2d4e0 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d   then all increm
2d4f0 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c  ental.**      bl
2d500 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
2d510 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74  on row iRow of t
2d520 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e  he B-Tree are in
2d530 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  validated..**.**
2d540 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45     3) If both pE
2d550 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20  xclude and iRow 
2d560 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c  are set to zero,
2d570 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   no incremental 
2d580 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75  blob .**      cu
2d590 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
2d5a0 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
2d5b0 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
2d5c0 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  cks(.  Btree *pB
2d5d0 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67  tree, .  Pgno pg
2d5e0 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72  noRoot, .  BtCur
2d5f0 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20  sor *pExclude,. 
2d600 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42   i64 iRow.){.  B
2d610 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
2d620 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
2d630 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
2d640 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
2d650 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
2d660 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2d670 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
2d680 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2d690 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2d6a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2d6b0 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2d6c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2d6d0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67   p->pgnoRoot!=pg
2d6e0 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75  noRoot ) continu
2d6f0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2d700 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2d710 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63      if( p->isInc
2d720 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28  rblobHandle && (
2d730 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45 78   .         (!pEx
2d740 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20  clude && iRow). 
2d750 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64       || (pExclud
2d760 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e  e && !pExclude->
2d770 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2d780 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   && p->info.nKey
2d790 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a  ==iRow).    )){.
2d7a0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
2d7b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2d7c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2d7d0 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
2d7e0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2d7f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2d800 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
2d810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d820 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
2d830 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62     || p->isIncrb
2d840 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66  lobHandle.#endif
2d850 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
2d860 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d  lite3 *dbOther =
2d870 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a   p->pBtree->db;.
2d880 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65        if( dbOthe
2d890 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  r==0 ||.        
2d8a0 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26   (dbOther!=db &&
2d8b0 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73   (dbOther->flags
2d8c0 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
2d8d0 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29  committed)==0) )
2d8e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d8f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2d900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d910 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2d920 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
2d930 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
2d940 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
2d950 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
2d960 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
2d970 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
2d980 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
2d990 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
2d9a0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
2d9b0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
2d9c0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
2d9d0 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
2d9e0 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
2d9f0 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2da00 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2da10 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2da20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
2da30 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
2da40 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
2da50 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
2da60 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
2da70 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
2da80 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
2da90 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
2daa0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
2dab0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
2dac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2dad0 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
2dae0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2daf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2db00 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
2db10 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
2db20 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2db30 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2db40 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2db50 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
2db60 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
2db70 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2db80 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
2db90 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
2dba0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2dbb0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dbd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
2dbe0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
2dbf0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
2dc00 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2dc30 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
2dc40 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
2dc50 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2dc60 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e   int szNew;.  in
2dc70 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2dc80 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
2dc90 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2dca0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2dcb0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2dcc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
2dcd0 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
2dce0 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
2dcf0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2dd00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2dd10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
2dd20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2dd30 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2dd40 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2dd50 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2dd60 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2dd70 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   an insert */.  
2dd80 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2dd90 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2dda0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2ddb0 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2ddc0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2ddd0 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2dde0 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75  ly );.  if( !pCu
2ddf0 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  r->wrFlag ){.   
2de00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2de10 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72  ERM;   /* Cursor
2de20 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72   not open for wr
2de30 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
2de40 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
2de50 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCur->pBtree, 
2de60 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2de70 70 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20  pCur, nKey) ){. 
2de80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2de90 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2dea0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2deb0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2dec0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
2ded0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2dee0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2def0 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2df00 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
2df10 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2df20 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2df30 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2df40 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2df50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2df60 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
2df70 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
2df80 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2df90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2dfa0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2dfb0 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
2dfc0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2dfd0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2dfe0 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
2dff0 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20  ey, appendBias, 
2e000 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20  &loc)).  ){.    
2e010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e020 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e030 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e040 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2e050 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
2e060 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
2e070 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2e080 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b   || !pPage->intK
2e090 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ey );.  TRACE(("
2e0a0 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
2e0b0 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
2e0c0 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
2e0d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
2e0e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
2e0f0 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
2e100 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
2e110 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
2e120 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
2e130 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
2e140 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2e150 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  ;.  allocateTemp
2e160 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65  Space(pBt);.  ne
2e170 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  wCell = pBt->pTm
2e180 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65  pSpace;.  if( ne
2e190 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
2e1a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2e1b0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2e1c0 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
2e1d0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
2e1e0 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72  ata, nData, nZer
2e1f0 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66  o, &szNew);.  if
2e200 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2e210 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74  insert;.  assert
2e220 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a  ( szNew==cellSiz
2e230 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43  ePtr(pPage, newC
2e240 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
2e250 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c  ( szNew<=MX_CELL
2e260 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
2e270 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2e280 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2e290 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20    if( loc==0 && 
2e2a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2e2b0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2e2c0 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
2e2d0 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
2e2e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2e2f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e300 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2e310 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2e320 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
2e330 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2e340 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
2e350 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2e360 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  , idx);.    if( 
2e370 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e380 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
2e390 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
2e3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
2e3b0 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
2e3c0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2e3d0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
2e3e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
2e3f0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2e400 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2e410 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f  rt;.    rc = dro
2e420 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  pCell(pPage, idx
2e430 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66  , szOld);.    if
2e440 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e450 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ) {.      goto e
2e460 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
2e470 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
2e480 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
2e490 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
2e4a0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2e4b0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70  );.    idx = ++p
2e4c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e4d0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43 75  >iPage];.    pCu
2e4e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2e4f0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
2e500 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65  idNKey = 0;.  }e
2e510 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2e520 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2e530 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72    }.  rc = inser
2e540 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  tCell(pPage, idx
2e550 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
2e560 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2e570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e580 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2e590 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a 0a  (pCur, 1);.  }..
2e5a0 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73    /* Must make s
2e5b0 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ure nOverflow is
2e5c0 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65   reset to zero e
2e5d0 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e  ven if the balan
2e5e0 63 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73 2e  ce().  ** fails.
2e5f0 20 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20    Internal data 
2e600 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
2e610 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
2e620 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20   otherwise. */. 
2e630 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e640 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2e650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2e660 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
2e670 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  low = 0;..  if( 
2e680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e690 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2e6a0 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
2e6b0 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20  nsert:.  return 
2e6c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2e6d0 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
2e6e0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
2e6f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
2e700 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2e710 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2e720 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63   a arbitrary loc
2e730 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
2e740 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2e750 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2e760 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2e770 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e780 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2e790 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73    int idx;.  uns
2e7a0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2e7b0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2e7c0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2e7d0 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2e7e0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2e7f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2e800 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2e810 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2e820 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2e830 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2e840 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2e850 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2e860 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2e870 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2e880 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2e890 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2e8a0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2e8b0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2e8c0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2e8d0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2e8e0 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2e8f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2e900 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2e910 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2e920 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2e930 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2e940 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2e950 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61 69 49  .  if( pCur->aiI
2e960 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
2e970 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2e980 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e990 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2e9a0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2e9b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2e9c0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2e9d0 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2e9e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e9f0 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2ea00 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2ea10 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2ea20 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2ea30 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2ea40 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2ea50 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2ea60 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  Cur, pCur->info.
2ea70 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74  nKey) ){.    ret
2ea80 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2ea90 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
2eaa0 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
2eab0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
2eac0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
2ead0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2eae0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
2eaf0 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
2eb00 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
2eb10 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
2eb20 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
2eb30 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
2eb40 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
2eb50 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
2eb60 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
2eb70 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
2eb80 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
2eb90 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
2eba0 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
2ebb0 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
2ebc0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
2ebd0 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
2ebe0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2ebf0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ec00 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2ec10 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2ec20 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2ec30 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
2ec40 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
2ec50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2ec60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2ec70 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2ec80 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2ec90 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
2eca0 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
2ecb0 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
2ecc0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2ecd0 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
2ece0 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
2ecf0 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
2ed00 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2ed10 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
2ed20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
2ed30 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
2ed40 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
2ed50 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2ed60 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2ed70 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2ed80 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
2ed90 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2eda0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43  eaf ){.    pgnoC
2edb0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2edc0 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63  pCell);.  }.  rc
2edd0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2ede0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66  ge, pCell);.  if
2edf0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2ee00 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
2ee10 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2ee20 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2ee30 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65  The entry we are
2ee40 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65   about to delete
2ee50 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73   is not a leaf s
2ee60 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20  o if we do not. 
2ee70 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69     ** do somethi
2ee80 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ng we will leave
2ee90 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e   a hole on an in
2eea0 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20  ternal page..   
2eeb0 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66   ** We have to f
2eec0 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20  ill the hole by 
2eed0 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c  moving in a cell
2eee0 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54   from a leaf.  T
2eef0 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43  he.    ** next C
2ef00 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e  ell after the on
2ef10 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
2ef20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2ef30 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a   exist and.    *
2ef40 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73  * to be a leaf s
2ef50 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e  o we can use it.
2ef60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75  .    */.    BtCu
2ef70 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20  rsor leafCur;.  
2ef80 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
2ef90 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75  Page = 0;..    u
2efa0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2efb0 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
2efc0 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
2efd0 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
2efe0 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
2eff0 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  t( !pPage->intKe
2f000 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
2f010 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
2f020 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2f030 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2f040 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2f050 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2f060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2f070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f080 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
2f090 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e  r.aiIdx[leafCur.
2f0a0 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20  iPage]==0 );.   
2f0b0 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c     pLeafPage = l
2f0c0 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65  eafCur.apPage[le
2f0d0 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20  afCur.iPage];.  
2f0e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f0f0 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
2f100 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2f110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2f120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f130 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72       int leafCur
2f140 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a  sorInvalid = 0;.
2f150 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74        u16 szNext
2f160 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2f170 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2f180 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2f190 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2f1a0 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2f1b0 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2f1c0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2f1d0 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67  ->pgno, pLeafPag
2f1e0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  e->pgno));.     
2f1f0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2f200 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
2f210 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2f220 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
2f230 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61  findCell(pLeafPa
2f240 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a  ge, 0);.      sz
2f250 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
2f260 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e  tr(pLeafPage, pN
2f270 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
2f280 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
2f290 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
2f2a0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74  );.      allocat
2f2b0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
2f2c0 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20  .      tempCell 
2f2d0 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
2f2e0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
2f2f0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2f300 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2f310 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2f320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f340 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2f350 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65  (pPage, idx, pNe
2f360 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20  xt-4, szNext+4, 
2f370 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  tempCell, 0);.  
2f380 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a      }...      /*
2f390 20 54 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   The "if" statem
2f3a0 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20  ent in the next 
2f3b0 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72  code block is cr
2f3c0 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  itical.  The.   
2f3d0 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20     ** slightest 
2f3e0 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74  error in that st
2f3f0 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c  atement would al
2f400 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70  low SQLite to op
2f410 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63  erate.      ** c
2f420 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66  orrectly most of
2f430 20 74 68 65 20 74 69 6d 65 20 62 75 74 20 70 72   the time but pr
2f440 6f 64 75 63 65 20 76 65 72 79 20 72 61 72 65 20  oduce very rare 
2f450 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20  failures.  To.  
2f460 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61      ** guard aga
2f470 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20 66  inst this, the f
2f480 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
2f490 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74  help to verify t
2f4a0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hat.      ** the
2f4b0 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20   "if" statement 
2f4c0 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a  is well tested..
2f4d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
2f4e0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
2f4f0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
2f500 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74  pPage->nFree<pBt
2f510 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2f520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2f530 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
2f540 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
2f550 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
2f560 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74  e*2/3 );.      t
2f570 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
2f580 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
2f590 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42  pPage->nFree==pB
2f5a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2f5b0 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3 .             
2f5c0 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
2f5d0 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
2f5e0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
2f5f0 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
2f600 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
2f610 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
2f620 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
2f630 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2f640 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20  /3+1 .          
2f650 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
2f660 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
2f670 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
2f680 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
2f690 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
2f6a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2f6b0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
2f6c0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2f6d0 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20  *2/3.           
2f6e0 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
2f6f0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2f700 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
2f710 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
2f720 20 20 74 65 73 74 63 61 73 65 28 20 28 70 50 61    testcase( (pPa
2f730 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2f740 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65  || (pPage->nFree
2f750 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
2f760 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20  ze*2/3)).       
2f770 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
2f780 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
2f790 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75  szNext == pBt->u
2f7a0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
2f7b0 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  ...      if( (pP
2f7c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2f7d0 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65   || (pPage->nFre
2f7e0 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e > pBt->usableS
2f7f0 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20  ize*2/3)) &&.   
2f800 20 20 20 20 20 20 20 28 70 4c 65 61 66 50 61 67         (pLeafPag
2f810 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
2f820 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
2f830 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29  ize*2/3).      )
2f840 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2f850 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2f860 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  n if the interna
2f870 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69  l node is now ei
2f880 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67  ther overflowing
2f890 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75  .        ** or u
2f8a0 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65  nderfull and the
2f8b0 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20   leaf node will 
2f8c0 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74  be underfull aft
2f8d0 65 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c  er the just cell
2f8e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70   .        ** cop
2f8f0 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ied to the inter
2f900 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65  nal node is dele
2f910 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69  ted from it. Thi
2f920 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20  s is a special. 
2f930 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62         ** case b
2f940 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
2f950 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20  to balance() to 
2f960 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74 65  correct the inte
2f970 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20  rnal node.      
2f980 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20    ** may change 
2f990 74 68 65 20 74 72 65 65 20 73 74 72 75 63 74 75  the tree structu
2f9a0 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  re and invalidat
2f9b0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2f9c0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
2f9d0 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
2f9e0 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69  ] and leafCur.ai
2f9f0 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68  Idx[] arrays, wh
2fa00 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ich will be.    
2fa10 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2fa20 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71  he balance() req
2fa30 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74  uired to correct
2fa40 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c   the underfull l
2fa50 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  eaf.        ** n
2fa60 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ode..        **.
2fa70 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66          ** The f
2fa80 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74  ormula used in t
2fa90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62  he expression ab
2faa0 6f 76 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e  ove are based on
2fab0 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20   facets of.     
2fac0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65     ** the SQLite
2fad0 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61   file-format tha
2fae0 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
2faf0 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20  over time..     
2fb00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65     */.        te
2fb10 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
2fb20 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
2fb30 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20  eSize*2/3+1 );. 
2fb40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2fb50 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
2fb60 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d  e+2+szNext==pBt-
2fb70 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b  >usableSize*2/3+
2fb80 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61  1 );.        lea
2fb90 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
2fba0 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20   1;.      }     
2fbb0 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72     ..      if( r
2fbc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fbd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fbe0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2fbf0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2fc00 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2fc10 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2fc20 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2fc30 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68  ge, idx), pgnoCh
2fc40 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56  ild);.        VV
2fc50 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
2fc60 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20  gesShuffled = 0 
2fc70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2fc80 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
2fc90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2fca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fcb0 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f 72  OK && leafCursor
2fcc0 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  Invalid ){.     
2fcd0 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e     /* The leaf-n
2fce0 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65 72  ode is now under
2fcf0 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65 20  full and so the 
2fd00 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
2fd10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 62   .        ** reb
2fd20 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65 72  alanced. However
2fd30 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  , the balance() 
2fd40 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
2fd50 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
2fd60 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20    ** node above 
2fd70 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65  may have modifie
2fd80 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  d the structure 
2fd90 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 6e  of the B-Tree an
2fda0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20  d.        ** so 
2fdb0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
2fdc0 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72 2e  ents of leafCur.
2fdd0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
2fde0 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20  fCur.aiIdx[].   
2fdf0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20       ** may not 
2fe00 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20 20  be trusted..    
2fe10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2fe20 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
2fe30 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68 65  ible to copy the
2fe40 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20 70   ancestry from p
2fe50 43 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d 65  Cur, as the same
2fe60 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
2fe70 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20 69  nce() call has i
2fe80 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 70  nvalidated the p
2fe90 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e  Cur->apPage[] an
2fea0 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20  d aiIdx[].      
2feb0 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20 20    ** arrays. .  
2fec0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2fed0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
2fee0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2fef0 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65 72  on() below inter
2ff00 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65 20  nally saves the 
2ff10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  .        ** key 
2ff20 74 68 61 74 20 6c 65 61 66 43 75 72 20 69 73 20  that leafCur is 
2ff30 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2ff40 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79  ng to. Currently
2ff50 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  , there.        
2ff60 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69 65  ** are two copie
2ff70 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69 6e  s of that key in
2ff80 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65 20   the tree - one 
2ff90 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61 66  here on the leaf
2ffa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2ffb0 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65   and one on some
2ffc0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
2ffd0 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68 65 20  n the tree. The 
2ffe0 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20 20  copy on.        
2fff0 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  ** the leaf node
30000 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
30010 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65 2d  ext key in tree-
30020 6f 72 64 65 72 20 61 66 74 65 72 20 74 68 65 20  order after the 
30030 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
30040 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
30050 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20 63   node. So, the c
30060 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
30070 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20 20  reeNext().      
30080 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f    ** calls resto
30090 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
300a0 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20  () to point the 
300b0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63 6f  cursor to the co
300c0 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  py.        ** st
300d0 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74 65  ored on the inte
300e0 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20  rnal node, then 
300f0 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65 20  advances to the 
30100 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20 20  next entry,.    
30110 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61 70      ** which hap
30120 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 63  pens to be the c
30130 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  opy of the key o
30140 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
30150 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ode..        ** 
30160 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61 66  Net effect: leaf
30170 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
30180 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70 6c  back to the dupl
30190 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20 20  icate cell.     
301a0 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73     ** that needs
301b0 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c 20   to be removed, 
301c0 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72 2e  and the leafCur.
301d0 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20  apPage[] and.   
301e0 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e       ** leafCur.
301f0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20 61  aiIdx[] arrays a
30200 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20 20  re correct..    
30210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56      */.        V
30220 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65  VA_ONLY( Pgno le
30230 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61  afPgno = pLeafPa
30240 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20  ge->pgno );.    
30250 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
30260 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61  sorPosition(&lea
30270 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 69  fCur);.        i
30280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
302a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
302b0 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
302c0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20 20  otUsed);.       
302d0 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66   }.        pLeaf
302e0 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61  Page = leafCur.a
302f0 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50  pPage[leafCur.iP
30300 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  age];.        as
30310 73 65 72 74 28 20 70 4c 65 61 66 50 61 67 65 2d  sert( pLeafPage-
30320 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20  >pgno==leafPgno 
30330 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
30340 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  t( leafCur.aiIdx
30350 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d  [leafCur.iPage]=
30360 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
30370 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
30380 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20 26 26  OK==rc.       &&
30390 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
303a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
303b0 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70  ite(pLeafPage->p
303c0 44 62 50 61 67 65 29 29 20 0a 20 20 20 20 20 20  DbPage)) .      
303d0 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  ){.        dropC
303e0 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30  ell(pLeafPage, 0
303f0 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20  , szNext);.     
30400 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61     VVA_ONLY( lea
30410 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c  fCur.pagesShuffl
30420 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  ed = 0 );.      
30430 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26    rc = balance(&
30440 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20  leafCur, 0);.   
30450 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
30460 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c  fCursorInvalid |
30470 7c 20 21 6c 65 61 66 43 75 72 2e 70 61 67 65 73  | !leafCur.pages
30480 53 68 75 66 66 6c 65 64 0a 20 20 20 20 20 20 20  Shuffled.       
30490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21              || !
304b0 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
304c0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
304d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
304e0 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
304f0 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29  Cursor(&leafCur)
30500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
30510 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
30520 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66  able=%d delete f
30530 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
30540 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
30550 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
30560 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  no));.    rc = d
30570 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
30580 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
30590 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
305a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
305b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
305c0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
305d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
305e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
305f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
30600 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
30610 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30620 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
30630 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
30640 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
30650 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
30660 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
30670 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
30680 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
30690 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
306a0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
306b0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
306c0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
306d0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
306e0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
306f0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
30700 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
30710 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
30720 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
30730 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
30740 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
30750 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
30760 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
30770 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
30780 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
30790 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
307a0 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
307b0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
307c0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
307d0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
307e0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
307f0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
30800 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30810 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
30820 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
30830 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
30840 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
30850 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
30860 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
30870 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
30880 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
30890 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
308a0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
308b0 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a  action first */.
308c0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
308d0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
308e0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
308f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
30900 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
30910 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
30920 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
30930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30940 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
30950 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
30960 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
30970 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
30980 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
30990 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
309a0 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
309b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
309c0 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
309d0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
309e0 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
309f0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
30a00 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
30a10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
30a20 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
30a30 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
30a40 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
30a50 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
30a60 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
30a70 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
30a80 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
30a90 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
30aa0 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
30ab0 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
30ac0 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
30ad0 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
30ae0 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
30af0 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
30b00 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
30b10 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
30b20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
30b30 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
30b40 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
30b50 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
30b60 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
30b70 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
30b80 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
30b90 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
30ba0 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
30bb0 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
30bc0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
30bd0 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
30be0 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
30bf0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
30c00 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
30c10 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
30c20 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
30c30 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
30c40 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
30c50 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
30c60 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
30c70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30c90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
30ca0 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
30cb0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
30cc0 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
30cd0 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
30ce0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
30cf0 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
30d00 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
30d10 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
30d20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f     while( pgnoRo
30d30 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
30d40 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
30d50 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
30d60 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
30d70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
30d80 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
30d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
30da0 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
30db0 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
30dc0 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
30dd0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
30de0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
30df0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
30e00 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
30e10 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
30e20 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
30e30 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
30e40 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
30e50 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
30e60 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
30e70 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
30e80 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
30e90 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
30ea0 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
30eb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30ed0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
30ee0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
30ef0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
30f00 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
30f10 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
30f20 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
30f30 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
30f40 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
30f50 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
30f60 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
30f70 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
30f80 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
30f90 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
30fa0 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
30fb0 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
30fc0 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
30fd0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
30fe0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
30ff0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
31000 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
31010 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
31020 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
31030 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
31040 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
31050 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
31060 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
31070 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
31080 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
31090 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
310a0 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
310b0 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
310c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
310d0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
310e0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
310f0 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
31100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31130 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
31140 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
31150 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
31160 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
31170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31180 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
31190 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
311a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
311b0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
311c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
311d0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
311e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
311f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
31200 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
31210 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
31220 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
31230 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
31240 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31250 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
31260 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
31270 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31290 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
312a0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
312b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
312c0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
312d0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
312e0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
312f0 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20  Page, pgnoMove, 
31300 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  0);.      releas
31310 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
31320 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
31330 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
31340 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
31350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31360 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
31370 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
31380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
31390 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
313a0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
313b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
313c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
313d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
313e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
313f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31400 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
31410 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31420 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
31440 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
31450 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
31460 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
31470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
31480 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
31490 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
314a0 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
314b0 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
314c0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
314d0 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
314e0 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
314f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
31500 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
31510 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
31520 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
31540 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
31550 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
31560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
31570 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
31580 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
31590 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
315a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
315b0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
315c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
315d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
315e0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
315f0 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
31600 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
31610 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31620 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
31630 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
31640 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31650 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
31660 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
31670 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
31680 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
31690 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
316a0 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
316b0 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
316c0 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
316d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
316e0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
316f0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
31700 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
31710 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
31720 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
31730 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
31740 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
31750 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
31760 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54  c = btreeCreateT
31770 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c  able(p, piTable,
31780 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74   flags);.  sqlit
31790 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
317a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
317b0 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
317c0 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
317d0 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
317e0 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
317f0 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
31800 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
31810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
31820 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
31830 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31840 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
31850 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
31860 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
31870 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
31880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31890 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
318a0 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65  ear */.  int fre
318b0 65 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f  ePageFlag,     /
318c0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67  * Deallocate pag
318d0 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  e if true */.  i
318e0 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a  nt *pnChange.){.
318f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31900 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
31910 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31920 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pCell;.  int i;
31930 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
31940 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
31950 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31960 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61  if( pgno>pagerPa
31970 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
31980 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31990 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
319a0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41    }..  rc = getA
319b0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
319c0 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
319d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
319e0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
319f0 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  _out;.  for(i=0;
31a00 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
31a10 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i++){.    pCell
31a20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
31a30 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21  e, i);.    if( !
31a40 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
31a50 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44       rc = clearD
31a60 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
31a70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
31a80 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a  , 1, pnChange);.
31a90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
31aa0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
31ab0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
31ac0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
31ad0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
31ae0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31af0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
31b00 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
31b10 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
31b20 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  af ){.    rc = c
31b30 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
31b40 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
31b50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29  pPage->aData[8])
31b60 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a  , 1, pnChange);.
31b70 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
31b80 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
31b90 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65  age_out;.  }else
31ba0 20 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b   if( pnChange ){
31bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31bc0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
31bd0 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70    *pnChange += p
31be0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  Page->nCell;.  }
31bf0 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46  .  if( freePageF
31c00 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
31c10 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
31c20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63  .  }else if( (rc
31c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31c40 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31c50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  age))==0 ){.    
31c60 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
31c70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
31c80 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d  | PTF_LEAF);.  }
31c90 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  ..cleardatabasep
31ca0 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  age_out:.  relea
31cb0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
31cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31cd0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
31ce0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
31cf0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
31d00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
31d10 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74    iTable is.** t
31d20 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
31d30 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  f the root of th
31d40 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20  e table.  After 
31d50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
31d60 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f  urns,.** the roo
31d70 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c  t page is empty,
31d80 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74   but still exist
31d90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
31da0 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
31db0 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
31dc0 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
31dd0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64  any open.** read
31de0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
31df0 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69  table.  Open wri
31e00 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d  te cursors are m
31e10 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72  oved to the.** r
31e20 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
31e30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61  ..**.** If pnCha
31e40 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nge is not NULL,
31e50 20 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62   then table iTab
31e60 6c 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e  le must be an in
31e70 74 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a  tkey table. The.
31e80 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ** integer value
31e90 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
31ea0 6e 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65  nChange is incre
31eb0 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75  mented by the nu
31ec0 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69  mber of.** entri
31ed0 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  es in the table.
31ee0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
31ef0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42  treeClearTable(B
31f00 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
31f10 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e  ble, int *pnChan
31f20 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
31f30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
31f40 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
31f50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
31f60 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
31f70 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  db;.  if( p->inT
31f80 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
31f90 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  E ){.    rc = pB
31fa0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
31fb0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
31fc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
31fd0 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
31fe0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
31ff0 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29  , iTable, 0, 1))
32000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32010 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
32020 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69   do */.  }else i
32030 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
32040 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
32050 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20  rs(pBt, iTable, 
32060 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  0)) ){.    /* no
32070 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
32080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
32090 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
320a0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
320b0 61 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67  able, 0, pnChang
320c0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
320d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
320e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
320f0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
32100 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
32110 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
32120 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
32130 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
32140 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
32150 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
32160 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
32170 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
32180 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
32190 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
321a0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
321b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
321c0 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
321d0 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
321e0 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
321f0 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
32200 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
32210 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
32220 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
32230 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
32240 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
32250 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
32260 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
32270 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
32280 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
32290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
322a0 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
322b0 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
322c0 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
322d0 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
322e0 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
322f0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
32300 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
32310 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
32320 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
32330 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
32340 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
32350 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
32360 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
32370 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
32380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32390 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
323a0 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
323b0 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
323c0 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
323d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
323e0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
323f0 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
32400 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
32410 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
32420 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
32430 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
32440 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
32450 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
32460 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
32470 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
32480 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
32490 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
324a0 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
324b0 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
324c0 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dure..*/.static 
324d0 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62  int btreeDropTab
324e0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  le(Btree *p, Pgn
324f0 6f 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  o iTable, int *p
32500 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
32510 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
32520 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  age = 0;.  BtSha
32530 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
32540 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
32550 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
32560 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28  utex(p) );.  if(
32570 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
32580 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
32590 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
325a0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
325b0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
325c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
325d0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
325e0 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69  o drop a table i
325f0 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72  f any cursors ar
32600 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20  e open on the.  
32610 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
32620 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
32630 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
32640 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79   the backend may
32650 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f  .  ** need to mo
32660 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d  ve another root-
32670 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67  page to fill a g
32680 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
32690 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74  eleted.  ** root
326a0 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65   page. If an ope
326b0 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69  n cursor was usi
326c0 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70  ng this page a p
326d0 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20  roblem would .  
326e0 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20  ** occur..  */. 
326f0 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
32700 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
32710 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
32720 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
32730 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
32740 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
32750 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
32760 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
32770 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
32780 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
32790 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b  e(p, iTable, 0);
327a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
327b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
327c0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
327d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f  rc;.  }..  *piMo
327e0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ved = 0;..  if( 
327f0 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64  iTable>1 ){.#ifd
32800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32810 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63  UTOVACUUM.    rc
32820 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
32830 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
32840 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73  age(pPage);.#els
32850 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  e.    if( pBt->a
32860 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32870 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50     Pgno maxRootP
32880 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  gno;.      rc = 
32890 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
328a0 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f  eta(p, 4, &maxRo
328b0 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  otPgno);.      i
328c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
328d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
328e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
328f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
32900 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
32910 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61    if( iTable==ma
32920 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20  xRootPgno ){.   
32930 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
32940 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
32950 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  ed is the table 
32960 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
32970 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
32980 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
32990 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75  the database, pu
329a0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
329b0 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  on the free list
329c0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
329d0 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
329e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
329f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32a00 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
32a10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32a20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
32a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32a40 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
32a50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
32a60 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
32a70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ped does not hav
32a80 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
32a90 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
32aa0 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
32ab0 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f   database. So mo
32ac0 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  ve the page that
32ad0 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a   does into the .
32ae0 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c          ** gap l
32af0 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
32b00 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20  ed root-page..  
32b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32b20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b   MemPage *pMove;
32b30 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
32b40 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
32b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32b60 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
32b70 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
32b80 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
32b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32bb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32bd0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
32be0 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54  e(pBt, pMove, PT
32bf0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
32c00 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
32c10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32c20 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
32c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
32c70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
32c80 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
32c90 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
32ca0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
32cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
32cd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
32ce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
32cf0 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  eePage(pMove);. 
32d00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
32d10 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
32d20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
32d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
32d60 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f  piMoved = maxRoo
32d70 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPgno;.      }..
32d80 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
32d90 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70   new 'max-root-p
32da0 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68  age' value in th
32db0 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
32dc0 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  r. This.      **
32dd0 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75   is the old valu
32de0 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73  e less one, less
32df0 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61   one more if tha
32e00 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20  t happens to.   
32e10 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d     ** be a root-
32e20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73  page number, les
32e30 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74  s one again if t
32e40 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20  hat is the.     
32e50 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
32e60 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a  _PAGE..      */.
32e70 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
32e80 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  o--;.      if( m
32e90 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44  axRootPgno==PEND
32ea0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32eb0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  t) ){.        ma
32ec0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
32ed0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
32ee0 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d  axRootPgno==PTRM
32ef0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d  AP_PAGENO(pBt, m
32f00 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20  axRootPgno) ){. 
32f10 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
32f20 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
32f30 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52      assert( maxR
32f40 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47  ootPgno!=PENDING
32f50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
32f60 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  );..      rc = s
32f70 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
32f80 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52  eMeta(p, 4, maxR
32f90 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  ootPgno);.    }e
32fa0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
32fb0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
32fc0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
32fd0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
32fe0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
32ff0 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  .    /* If sqlit
33000 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
33010 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70   was called on p
33020 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65  age 1. */.    ze
33030 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54  roPage(pPage, PT
33040 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
33050 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  F );.    release
33060 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
33070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
33080 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
33090 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
330a0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
330b0 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
330c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
330d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
330e0 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20  );.  p->pBt->db 
330f0 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20  = p->db;.  rc = 
33100 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70  btreeDropTable(p
33110 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65  , iTable, piMove
33120 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  d);.  sqlite3Btr
33130 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
33140 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
33150 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61  ** Read the meta
33160 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74  -information out
33170 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66   of a database f
33180 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ile.  Meta[0].**
33190 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
331a0 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72  f free pages cur
331b0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61  rently in the da
331c0 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d  tabase.  Meta[1]
331d0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61  .** through meta
331e0 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62  [15] are availab
331f0 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69  le for use by hi
33200 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65  gher layers.  Me
33210 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64  ta[0].** is read
33220 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72  -only, the other
33230 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
33240 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68  ..** .** The sch
33250 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72  ema layer number
33260 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69  s meta values di
33270 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74  fferently.  At t
33280 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79  he schema.** lay
33290 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43  er (and the SetC
332a0 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f  ookie and ReadCo
332b0 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68  okie opcodes) th
332c0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66  e number of.** f
332d0 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74  ree pages is not
332e0 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f   visible.  So Co
332f0 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73  okie[0] is the s
33300 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a  ame as Meta[1]..
33310 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33320 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65  reeGetMeta(Btree
33330 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
33340 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50  2 *pMeta){.  DbP
33350 61 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30  age *pDbPage = 0
33360 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
33370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
33380 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
33390 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
333a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
333b0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
333c0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65   p->db;..  /* Re
333d0 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74  ading a meta-dat
333e0 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73  a value requires
333f0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
33400 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63  page 1 (and henc
33410 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  e.  ** the sqlit
33420 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
33430 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63  We grab this loc
33440 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  k regardless of 
33450 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20  whether or.  ** 
33460 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52  not the SQLITE_R
33470 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
33480 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20  lag is set (the 
33490 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
334a0 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74  page.  ** 1 is t
334b0 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63  reated as a spec
334c0 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72  ial case by quer
334d0 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64  yTableLock() and
334e0 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20   lockTable()).. 
334f0 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
33500 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20  TableLock(p, 1, 
33510 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
33520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
33540 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
33550 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
33560 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
33570 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  0 && idx<=15 );.
33580 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
33590 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
335a0 62 2d 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  b-tree is alread
335b0 79 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  y holding a refe
335c0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
335d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
335e0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20      ** file. In 
335f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65  this case the re
33600 71 75 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61  quired meta-data
33610 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65   value can be re
33620 61 64 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20  ad directly.    
33630 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ** from the page
33640 20 64 61 74 61 20 6f 66 20 74 68 69 73 20 72 65   data of this re
33650 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73  ference. This is
33660 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
33670 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71   than.    ** req
33680 75 65 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65  uesting a new re
33690 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65  ference from the
336a0 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20   pager layer..  
336b0 20 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28    */.    pP1 = (
336c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
336d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
336e0 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
336f0 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64   /* The b-tree d
33700 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72  oes not have a r
33710 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
33720 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
33730 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
33740 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20  Obtain one from 
33750 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e  the pager layer.
33760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33770 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33780 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c  (pBt->pPager, 1,
33790 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
337a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
337b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
337c0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
337d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
337e0 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
337f0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
33800 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
33810 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65  age);.  }.  *pMe
33820 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ta = get4byte(&p
33830 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b  P1[36 + idx*4]);
33840 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d  ..  /* If the b-
33850 74 72 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64  tree is not hold
33860 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
33870 74 6f 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  to page 1, then 
33880 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65  one was .  ** re
33890 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
338a0 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20   pager layer in 
338b0 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e  the above block.
338c0 20 52 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   Release it now.
338d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74  .  */.  if( !pBt
338e0 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20  ->pPage1 ){.    
338f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
33900 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  f(pDbPage);.  }.
33910 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63  .  /* If autovac
33920 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65  uumed is disable
33930 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20  d in this build 
33940 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  but we are tryin
33950 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73  g to .  ** acces
33960 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65  s an autovacuume
33970 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  d database, then
33980 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61   make the databa
33990 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20  se readonly. .  
339a0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
339b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
339c0 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26  .  if( idx==4 &&
339d0 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d   *pMeta>0 ) pBt-
339e0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23  >readOnly = 1;.#
339f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62  endif..  /* Grab
33a00 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f   the read-lock o
33a10 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72  n page 1. */.  r
33a20 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
33a30 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
33a40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
33a50 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
33a60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
33a70 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
33a80 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
33a90 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
33aa0 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
33ab0 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
33ac0 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
33ad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33ae0 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
33af0 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
33b00 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
33b10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
33b20 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
33b30 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
33b40 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
33b50 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
33b60 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
33b70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
33b80 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
33b90 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
33ba0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
33bb0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
33bc0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
33bd0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
33be0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
33bf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
33c00 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
33c10 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70      pP1 = pBt->p
33c20 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
33c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33c40 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
33c50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
33c60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
33c80 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
33c90 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
33ca0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33cb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33cc0 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d  .      if( idx==
33cd0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  7 ){.        ass
33ce0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
33cf0 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
33d00 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
33d10 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20  rt( iMeta==0 || 
33d20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20  iMeta==1 );.    
33d30 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
33d40 75 75 6d 20 3d 20 28 75 38 29 69 4d 65 74 61 3b  uum = (u8)iMeta;
33d50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
33d60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
33d70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
33d80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33d90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33da0 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20  he flag byte at 
33db0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
33dc0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
33dd0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
33de0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
33df0 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
33e00 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28  lite3BtreeFlags(
33e10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
33e20 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
33e30 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45   about CURSOR_RE
33e40 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f  QUIRESEEK state?
33e50 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74   Probably need t
33e60 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74  o call.  ** rest
33e70 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
33e80 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  n() here..  */. 
33e90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
33ea0 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  .  restoreCursor
33eb0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
33ec0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
33ed0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
33ee0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ge];.  assert( c
33ef0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
33f00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
33f10 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70  t( pPage->pBt==p
33f20 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65  Cur->pBt );.  re
33f30 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61  turn pPage ? pPa
33f40 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
33f50 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b  >hdrOffset] : 0;
33f60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
33f70 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f  n the pager asso
33f80 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54  ciated with a BT
33f90 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ree.  This routi
33fa0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  ne is used for.*
33fb0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
33fc0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
33fd0 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42  .Pager *sqlite3B
33fe0 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20  treePager(Btree 
33ff0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
34000 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a  >pBt->pPager;.}.
34010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34020 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
34030 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
34040 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
34050 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
34060 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
34070 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
34080 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
34090 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
340a0 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
340b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
340c0 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
340d0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
340e0 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  ( !pCheck->mxErr
340f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68   ) return;.  pCh
34100 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20  eck->mxErr--;.  
34110 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a  pCheck->nErr++;.
34120 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
34130 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70  Format);.  if( p
34140 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43  Check->errMsg.nC
34150 68 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  har ){.    sqlit
34160 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
34170 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
34180 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a  , "\n", 1);.  }.
34190 20 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20    if( zMsg1 ){. 
341a0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
341b0 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
341c0 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  ->errMsg, zMsg1,
341d0 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   -1);.  }.  sqli
341e0 74 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68  te3VXPrintf(&pCh
341f0 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20  eck->errMsg, 1, 
34200 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
34210 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
34220 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  ( pCheck->errMsg
34230 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  .mallocFailed ){
34240 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c  .    pCheck->mal
34250 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
34260 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
34270 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
34280 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
34290 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
342a0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
342b0 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
342c0 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
342d0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
342e0 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
342f0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
34300 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34310 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
34320 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
34330 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
34340 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
34350 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
34360 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
34370 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
34380 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
34390 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
343a0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
343b0 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
343c0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
343d0 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
343e0 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
343f0 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
34400 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
34410 6b 2c 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63  k, Pgno iPage, c
34420 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a  har *zContext){.
34430 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
34440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
34450 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e   iPage>pCheck->n
34460 50 61 67 65 20 29 7b 0a 20 20 20 20 63 68 65 63  Page ){.    chec
34470 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
34480 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e  k, zContext, "in
34490 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
344a0 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  r %d", iPage);. 
344b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
344c0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61  .  if( pCheck->a
344d0 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29  nRef[iPage]==1 )
344e0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
344f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
34500 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65  ntext, "2nd refe
34510 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64  rence to page %d
34520 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72  ", iPage);.    r
34530 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
34540 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e  eturn  (pCheck->
34550 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e  anRef[iPage]++)>
34560 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
34570 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
34580 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  CUUM./*.** Check
34590 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
345a0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
345b0 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69  ap for page iChi
345c0 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70  ld maps to .** p
345d0 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69  age iParent, poi
345e0 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70  nter type ptrTyp
345f0 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e  e. If not, appen
34600 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
34610 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e  ge.** to pCheck.
34620 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34630 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49  checkPtrmap(.  I
34640 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
34650 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69  ck,   /* Integri
34660 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74  ty check context
34670 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
34680 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
34690 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65  Child page numbe
346a0 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  r */.  u8 eType,
346b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
346c0 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
346d0 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20  r map type */.  
346e0 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20  Pgno iParent,   
346f0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
34700 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ed pointer map p
34710 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
34720 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  r */.  char *zCo
34730 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a  ntext         /*
34740 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70   Context descrip
34750 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65  tion (used for e
34760 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a  rror msg) */.){.
34770 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65    int rc;.  u8 e
34780 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67  PtrmapType;.  Pg
34790 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  no iPtrmapParent
347a0 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70  ;..  rc = ptrmap
347b0 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c  Get(pCheck->pBt,
347c0 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61   iChild, &ePtrma
347d0 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50  pType, &iPtrmapP
347e0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
347f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34800 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34810 45 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b  E_NOMEM ) pCheck
34820 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
34830 20 31 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   1;.    checkApp
34840 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
34850 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64  Context, "Failed
34860 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20   to read ptrmap 
34870 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29  key=%d", iChild)
34880 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
34890 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70  }..  if( ePtrmap
348a0 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69  Type!=eType || i
348b0 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50  PtrmapParent!=iP
348c0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65  arent ){.    che
348d0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
348e0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
348f0 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61       "Bad ptr ma
34900 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65  p entry key=%d e
34910 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20  xpected=(%d,%d) 
34920 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20  got=(%d,%d)", . 
34930 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79       iChild, eTy
34940 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74  pe, iParent, ePt
34950 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61  rmapType, iPtrma
34960 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
34970 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
34980 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
34990 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
349a0 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  t or of an overf
349b0 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  low page list..*
349c0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
349d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
349e0 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73  s on the list is
349f0 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   N..*/.static vo
34a00 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20  id checkList(.  
34a10 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
34a20 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69  eck,  /* Integri
34a30 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74  ty checking cont
34a40 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46  ext */.  int isF
34a50 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  reeList,       /
34a60 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65  * True for a fre
34a70 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f  elist.  False fo
34a80 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  r overflow page 
34a90 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  list */.  int iP
34aa0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
34ab0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
34ac0 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e  or first page in
34ad0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
34ae0 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
34af0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
34b00 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
34b10 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
34b20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
34b30 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
34b40 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
34b50 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sages */.){.  in
34b60 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63  t i;.  int expec
34b70 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69  ted = N;.  int i
34b80 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20  First = iPage;. 
34b90 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20   while( N-- > 0 
34ba0 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
34bb0 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
34bc0 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75  pOvflPage;.    u
34bd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f  nsigned char *pO
34be0 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28  vflData;.    if(
34bf0 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20   iPage<1 ){.    
34c00 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34c10 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
34c20 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20  t,.         "%d 
34c30 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73  of %d pages miss
34c40 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f  ing from overflo
34c50 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  w list starting 
34c60 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  at %d",.        
34c70 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c    N+1, expected,
34c80 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
34c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
34ca0 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
34cb0 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f  heck, iPage, zCo
34cc0 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a  ntext) ) break;.
34cd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
34ce0 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e  agerGet(pCheck->
34cf0 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50  pPager, (Pgno)iP
34d00 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29  age, &pOvflPage)
34d10 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
34d20 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
34d30 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c   zContext, "fail
34d40 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25  ed to get page %
34d50 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
34d60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
34d70 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28     pOvflData = (
34d80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
34d90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
34da0 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ata(pOvflPage);.
34db0 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69      if( isFreeLi
34dc0 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
34dd0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  n = get4byte(&pO
34de0 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66  vflData[4]);.#if
34df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34e00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34e10 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
34e20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
34e30 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
34e40 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61  rmap(pCheck, iPa
34e50 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
34e60 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
34e70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
34e80 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43  f.      if( n>pC
34e90 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  heck->pBt->usabl
34ea0 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20  eSize/4-2 ){.   
34eb0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
34ec0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
34ed0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
34ee0 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20   "freelist leaf 
34ef0 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e  count too big on
34f00 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
34f10 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a  );.        N--;.
34f20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34f30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
34f40 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
34f50 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67     Pgno iFreePag
34f60 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  e = get4byte(&pO
34f70 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  vflData[8+i*4]);
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 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
34fb0 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
34fc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
34fd0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
34fe0 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
34ff0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
35000 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
35010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
35020 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
35030 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
35040 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e   iFreePage, zCon
35050 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  text);.        }
35060 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b  .        N -= n;
35070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
35080 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35090 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
350a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
350b0 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
350c0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
350d0 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65  vacuum and iPage
350e0 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
350f0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69  .      ** page i
35100 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  n this overflow 
35110 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74  list, check that
35120 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
35130 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20   entry for.     
35140 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
35150 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69  g page matches i
35160 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Page..      */. 
35170 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
35180 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
35190 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20   && N>0 ){.     
351a0 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28     i = get4byte(
351b0 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20  pOvflData);.    
351c0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
351d0 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41  pCheck, i, PTRMA
351e0 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61  P_OVERFLOW2, iPa
351f0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
35200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
35210 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20  dif.    iPage = 
35220 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
35230 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
35240 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
35250 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Page);.  }.}.#en
35260 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
35270 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
35280 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
35290 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
352a0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
352b0 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69   Do various sani
352c0 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73  ty checks on a s
352d0 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20  ingle page of a 
352e0 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tree.  Return.**
352f0 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e   the tree depth.
35300 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74    Root pages ret
35310 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20  urn 0.  Parents 
35320 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a  of root pages.**
35330 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73   return 1, and s
35340 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  o forth..** .** 
35350 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65  These checks are
35360 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   done:.**.**    
35370 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    1.  Make sure 
35380 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66  that cells and f
35390 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74  reeblocks do not
353a0 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20   overlap.**     
353b0 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65       but combine
353c0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63   to completely c
353d0 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a  over the page..*
353e0 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20  *  NO  2.  Make 
353f0 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61  sure cell keys a
35400 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20  re in order..** 
35410 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75   NO  3.  Make su
35420 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73  re no key is les
35430 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
35440 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a  to zLowerBound..
35450 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65  **  NO  4.  Make
35460 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
35470 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
35480 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42  equal to zUpperB
35490 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e  ound..**      5.
354a0 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65    Check the inte
354b0 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f  grity of overflo
354c0 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20  w pages..**     
354d0 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79   6.  Recursively
354e0 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50   call checkTreeP
354f0 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64  age on all child
35500 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20  ren..**      7. 
35510 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
35520 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68   depth of all ch
35530 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61  ildren is the sa
35540 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20  me..**      8.  
35550 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70  Make sure this p
35560 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  age is at least 
35570 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65  33% full or else
35580 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20   it is.**       
35590 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74     the root of t
355a0 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  he tree..*/.stat
355b0 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65  ic int checkTree
355c0 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74  Page(.  Integrit
355d0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
355e0 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   Context for the
355f0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f   sanity check */
35600 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
35610 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35620 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
35630 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  age to check */.
35640 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43    char *zParentC
35650 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e  ontext  /* Paren
35660 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  t context */.){.
35670 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35680 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64  ;.  int i, rc, d
35690 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20  epth, d2, pgno, 
356a0 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20  cnt;.  int hdr, 
356b0 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74  cellStart;.  int
356c0 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61   nCell;.  u8 *da
356d0 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
356e0 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  pBt;.  int usabl
356f0 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43  eSize;.  char zC
35700 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63  ontext[100];.  c
35710 68 61 72 20 2a 68 69 74 20 3d 20 30 3b 0a 0a 20  har *hit = 0;.. 
35720 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
35730 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
35740 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50  t), zContext, "P
35750 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
35760 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
35770 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
35780 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
35790 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
357a0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
357b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
357c0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
357d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
357e0 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
357f0 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
35800 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
35810 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73  0;.  if( (rc = s
35820 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
35830 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
35840 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
35850 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  !=0 ){.    if( r
35860 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35870 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63  ) pCheck->malloc
35880 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
35890 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
358a0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
358b0 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20  .       "unable 
358c0 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e  to get the page.
358d0 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c   error code=%d",
358e0 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   rc);.    return
358f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72   0;.  }.  if( (r
35900 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
35910 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 29  InitPage(pPage))
35920 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  !=0 ){.    if( r
35930 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35940 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63  ) pCheck->malloc
35950 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
35960 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
35970 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
35980 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
35990 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72       "sqlite3Btr
359a0 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74  eeInitPage() ret
359b0 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20  urns error code 
359c0 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
359d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
359e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
359f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
35a00 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  out all the cell
35a10 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20  s..  */.  depth 
35a20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
35a30 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  i<pPage->nCell &
35a40 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b  & pCheck->mxErr;
35a50 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
35a60 43 65 6c 6c 3b 0a 20 20 20 20 75 33 32 20 73 7a  Cell;.    u32 sz
35a70 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ;.    CellInfo i
35a80 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  nfo;..    /* Che
35a90 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66  ck payload overf
35aa0 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f  low pages.    */
35ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
35ac0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
35ad0 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
35ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
35af0 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20  On tree page %d 
35b00 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67  cell %d: ", iPag
35b10 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c  e, i);.    pCell
35b20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
35b30 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e,i);.    sqlite
35b40 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
35b50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
35b60 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20   &info);.    sz 
35b70 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  = info.nData;.  
35b80 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
35b90 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 28 69 6e  tKey ) sz += (in
35ba0 74 29 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  t)info.nKey;.   
35bb0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66   assert( sz==inf
35bc0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
35bd0 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c    if( sz>info.nL
35be0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocal ){.      in
35bf0 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20  t nPage = (sz - 
35c00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73  info.nLocal + us
35c10 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75  ableSize - 5)/(u
35c20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
35c30 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
35c40 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
35c50 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
35c60 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20  flow]);.#ifndef 
35c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35c80 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
35c90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
35cb0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
35cc0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
35cd0 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67  _OVERFLOW1, iPag
35ce0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
35cf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35d00 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68     checkList(pCh
35d10 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c  eck, 0, pgnoOvfl
35d20 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , nPage, zContex
35d30 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
35d40 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f  * Check sanity o
35d50 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  f left child pag
35d60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
35d70 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35d80 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  {.      pgno = g
35d90 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
35da0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35db0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35dc0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
35dd0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
35de0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
35df0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
35e00 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
35e10 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
35e20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35e30 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65     d2 = checkTre
35e40 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
35e50 6e 6f 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  no, zContext);. 
35e60 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
35e70 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
35e80 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
35e90 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
35ea0 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
35eb0 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
35ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35ed0 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
35ee0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
35ef0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
35f00 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
35f10 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
35f20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
35f30 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
35f40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
35f50 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
35f60 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
35f70 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
35f80 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
35f90 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
35fa0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
35fb0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35fc0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
35fd0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
35fe0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
35ff0 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
36000 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
36010 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
36020 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
36030 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
36040 6f 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  o, zContext);.  
36050 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
36060 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
36070 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
36080 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
36090 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
360a0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
360b0 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
360c0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
360d0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
360e0 29 3b 0a 20 20 69 66 28 20 68 69 74 3d 3d 30 20  );.  if( hit==0 
360f0 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d  ){.    pCheck->m
36100 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
36110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 31  .  }else{.    u1
36120 36 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20  6 contentOffset 
36130 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
36140 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 69 66  [hdr+5]);.    if
36150 20 28 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20   (contentOffset 
36160 3e 20 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a  > usableSize) {.
36170 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
36180 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
36190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
361a0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
361b0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 68 65  n detected in he
361c0 61 64 65 72 20 6f 6e 20 70 61 67 65 20 25 64 22  ader on page %d"
361d0 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
361e0 20 67 6f 74 6f 20 63 68 65 63 6b 5f 70 61 67 65   goto check_page
361f0 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _abort;.    }.  
36200 20 20 6d 65 6d 73 65 74 28 68 69 74 2b 63 6f 6e    memset(hit+con
36210 74 65 6e 74 4f 66 66 73 65 74 2c 20 30 2c 20 75  tentOffset, 0, u
36220 73 61 62 6c 65 53 69 7a 65 2d 63 6f 6e 74 65 6e  sableSize-conten
36230 74 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 6d 65  tOffset);.    me
36240 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 63 6f 6e  mset(hit, 1, con
36250 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20  tentOffset);.   
36260 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
36270 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
36280 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
36290 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
362a0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
362b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
362c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
362d0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
362e0 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
362f0 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20  *2]);.      u16 
36300 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
36310 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
36320 69 66 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69  if( pc<=usableSi
36330 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 69  ze ){.        si
36340 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
36350 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
36360 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
36370 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31    if( (pc+size-1
36380 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
36390 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   pc<0 ){.       
363a0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
363b0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
363c0 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
363d0 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
363e0 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
363f0 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
36400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36410 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69       for(j=pc+si
36420 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d  ze-1; j>=pc; j--
36430 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
36440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
36450 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62  r(cnt=0, i=get2b
36460 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
36470 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62  ); i>0 && i<usab
36480 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30  leSize && cnt<10
36490 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20  000; .          
364a0 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69   cnt++){.      i
364b0 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
364c0 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a  te(&data[i+2]);.
364d0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
364e0 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31     if( (i+size-1
364f0 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
36500 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
36510 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
36520 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20  Check, 0,  .    
36530 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
36540 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
36550 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
36560 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
36570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36580 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a       for(j=i+siz
36590 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  e-1; j>=i; j--) 
365a0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
365b0 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32  }.      i = get2
365c0 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a  byte(&data[i]);.
365d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
365e0 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53  cnt=0; i<usableS
365f0 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ize; i++){.     
36600 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29   if( hit[i]==0 )
36610 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
36620 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36630 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
36640 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
36650 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20  Msg(pCheck, 0,. 
36660 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70           "Multip
36670 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65  le uses for byte
36680 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
36690 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20   i, iPage);.    
366a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
366b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
366c0 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37   cnt!=data[hdr+7
366d0 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ] ){.      check
366e0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
366f0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
36700 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63  "Fragmented spac
36710 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70  e is %d byte rep
36720 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70  orted as %d on p
36730 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20  age %d",.       
36740 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72     cnt, data[hdr
36750 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  +7], iPage);.   
36760 20 7d 0a 20 20 7d 0a 63 68 65 63 6b 5f 70 61 67   }.  }.check_pag
36770 65 5f 61 62 6f 72 74 3a 0a 20 20 69 66 20 28 68  e_abort:.  if (h
36780 69 74 29 20 73 71 6c 69 74 65 33 50 61 67 65 46  it) sqlite3PageF
36790 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
367a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
367b0 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
367c0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
367d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
367e0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
367f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36800 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
36810 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
36820 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
36830 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
36840 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
36850 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
36860 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
36870 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
36880 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
36890 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
368a0 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
368b0 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
368c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
368d0 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
368e0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75  .** Write the nu
368f0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 20 73 65  mber of error se
36900 65 6e 20 69 6e 20 2a 70 6e 45 72 72 2e 20 20 45  en in *pnErr.  E
36910 78 63 65 70 74 20 66 6f 72 20 73 6f 6d 65 20 6d  xcept for some m
36920 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
36930 69 6f 6e 20 65 72 72 6f 72 73 2c 20 20 61 6e 20  ion errors,  an 
36940 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65  error message he
36950 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ld in memory obt
36960 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
36970 6c 6c 6f 63 20 69 73 20 72 65 74 75 72 6e 65 64  lloc is returned
36980 20 69 66 20 2a 70 6e 45 72 72 20 69 73 20 6e 6f   if *pnErr is no
36990 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70 6e 45  n-zero.  If *pnE
369a0 72 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c 4c 20  rr==0 then NULL 
369b0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
369c0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
369d0 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
369e0 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
369f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
36a00 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
36a10 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42  egrityCheck(.  B
36a20 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20  tree *p,     /* 
36a30 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  The btree to be 
36a40 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
36a50 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e   *aRoot,   /* An
36a60 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70   array of root p
36a70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  ages numbers for
36a80 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65   individual tree
36a90 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  s */.  int nRoot
36aa0 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
36ab0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
36ac0 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ot[] */.  int mx
36ad0 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20  Err,    /* Stop 
36ae0 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73  reporting errors
36af0 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79   after this many
36b00 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72   */.  int *pnErr
36b10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d      /* Write num
36b20 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
36b30 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  en to this varia
36b40 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ble */.){.  Pgno
36b50 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
36b60 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
36b70 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64  heck;.  BtShared
36b80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
36b90 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d    char zErr[100]
36ba0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
36bb0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
36bc0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
36bd0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
36be0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
36bf0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
36c00 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
36c10 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ry(p)!=SQLITE_OK
36c20 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d   ){.    *pnErr =
36c30 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
36c40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
36c50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36c60 44 62 53 74 72 44 75 70 28 30 2c 20 22 63 61 6e  DbStrDup(0, "can
36c70 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20 72 65  not acquire a re
36c80 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
36c90 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
36ca0 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
36cb0 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
36cc0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
36cd0 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
36ce0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
36cf0 74 28 73 43 68 65 63 6b 2e 70 42 74 29 3b 0a 20  t(sCheck.pBt);. 
36d00 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20   sCheck.mxErr = 
36d10 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e  mxErr;.  sCheck.
36d20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 43 68 65  nErr = 0;.  sChe
36d30 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  ck.mallocFailed 
36d40 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  = 0;.  *pnErr = 
36d50 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
36d60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36d70 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  M.  if( pBt->nTr
36d80 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43  unc!=0 ){.    sC
36d90 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74  heck.nPage = pBt
36da0 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65  ->nTrunc;.  }.#e
36db0 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63  ndif.  if( sChec
36dc0 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  k.nPage==0 ){.  
36dd0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
36de0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
36df0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
36e00 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
36e10 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b   0;.  }.  sCheck
36e20 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  .anRef = sqlite3
36e30 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e  Malloc( (sCheck.
36e40 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
36e50 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
36e60 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63   );.  if( !sChec
36e70 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75  k.anRef ){.    u
36e80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
36e90 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e  ed(pBt);.    *pn
36ea0 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Err = 1;.    sql
36eb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
36ec0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
36ed0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
36ee0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b  i<=sCheck.nPage;
36ef0 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e   i++){ sCheck.an
36f00 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20  Ref[i] = 0; }.  
36f10 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  i = PENDING_BYTE
36f20 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66  _PAGE(pBt);.  if
36f30 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ( i<=sCheck.nPag
36f40 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e  e ){.    sCheck.
36f50 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20  anRef[i] = 1;.  
36f60 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
36f70 63 75 6d 49 6e 69 74 28 26 73 43 68 65 63 6b 2e  cumInit(&sCheck.
36f80 65 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73 69  errMsg, zErr, si
36f90 7a 65 6f 66 28 7a 45 72 72 29 2c 20 32 30 30 30  zeof(zErr), 2000
36fa0 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  0);..  /* Check 
36fb0 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
36fc0 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
36fd0 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26  */.  checkList(&
36fe0 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62  sCheck, 1, get4b
36ff0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
37000 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20  ->aData[32]),.  
37010 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
37020 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
37030 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61  >aData[36]), "Ma
37040 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b  in freelist: ");
37050 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c  ..  /* Check all
37060 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a   the tables..  *
37070 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 69 6e  /.  for(i=0; (in
37080 74 29 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68  t)i<nRoot && sCh
37090 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
370a0 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69  .    if( aRoot[i
370b0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
370c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
370d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
370e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
370f0 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74  oVacuum && aRoot
37100 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63  [i]>1 ){.      c
37110 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65  heckPtrmap(&sChe
37120 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54  ck, aRoot[i], PT
37130 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
37140 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
37150 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
37160 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52  Page(&sCheck, aR
37170 6f 6f 74 5b 69 5d 2c 20 22 4c 69 73 74 20 6f 66  oot[i], "List of
37180 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b   tree roots: ");
37190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
371a0 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20  sure every page 
371b0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  in the file is r
371c0 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20  eferenced.  */. 
371d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68   for(i=1; i<=sCh
371e0 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68  eck.nPage && sCh
371f0 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
37200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
37210 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
37220 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
37230 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Ref[i]==0 ){.   
37240 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
37250 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
37260 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
37270 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
37280 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66  .#else.    /* If
37290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
372a0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
372b0 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f  um, make sure no
372c0 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a   tables contain.
372d0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
372e0 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s to pointer-map
372f0 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   pages..    */. 
37300 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
37310 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20  Ref[i]==0 && .  
37320 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
37330 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c  ENO(pBt, i)!=i |
37340 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
37350 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
37360 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
37370 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
37380 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
37390 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
373a0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
373b0 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
373c0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
373d0 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  pBt, i)==i && pB
373e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
373f0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
37400 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
37410 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
37420 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
37430 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
37440 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
37450 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
37460 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
37470 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
37480 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
37490 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
374a0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
374b0 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65  ( nRef != sqlite
374c0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
374d0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
374e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
374f0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20  g(&sCheck, 0, . 
37500 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e       "Outstandin
37510 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65  g page count goe
37520 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20  s from %d to %d 
37530 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c  during this anal
37540 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65  ysis",.      nRe
37550 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f, sqlite3PagerR
37560 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
37570 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  ger).    );.  }.
37580 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20  .  /* Clean  up 
37590 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72  and report error
375a0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
375b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
375c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
375d0 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
375e0 69 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f  if( sCheck.mallo
375f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
37600 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 65  qlite3StrAccumRe
37610 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d  set(&sCheck.errM
37620 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20  sg);.    *pnErr 
37630 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b 31 3b  = sCheck.nErr+1;
37640 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
37650 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43   }.  *pnErr = sC
37660 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69 66 28  heck.nErr;.  if(
37670 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20   sCheck.nErr==0 
37680 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
37690 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65  mReset(&sCheck.e
376a0 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e  rrMsg);.  return
376b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
376c0 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e 65  Finish(&sCheck.e
376d0 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64 69 66  rrMsg);.}.#endif
376e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
376f0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
37700 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
37710 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
37720 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  me of the underl
37730 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
37740 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
37750 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  ger filename is 
37760 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
37770 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
37780 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
37790 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
377a0 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
377b0 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
377c0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
377d0 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
377e0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
377f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
37800 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
37810 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
37820 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
37830 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
37840 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
37850 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
37860 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
37870 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
37880 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
37890 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64 69 72  ** The pager dir
378a0 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69  ectory name is i
378b0 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
378c0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
378d0 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
378e0 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
378f0 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
37900 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
37910 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
37920 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
37930 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
37940 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
37950 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
37960 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
37970 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74  erDirname(p->pBt
37980 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
37990 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
379a0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
379b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
379c0 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54  this database. T
379d0 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
379e0 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ue of this routi
379f0 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  ne is the same r
37a00 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
37a10 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
37a20 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
37a30 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74  n created or not
37a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
37a50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
37a60 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
37a70 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
37a80 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
37a90 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
37aa0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
37ab0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
37ac0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
37ad0 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
37ae0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74  etJournalname(Bt
37af0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
37b00 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
37b10 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
37b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
37b30 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rnalname(p->pBt-
37b40 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
37b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37b60 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f  _VACUUM./*.** Co
37b70 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
37b80 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72  content of pBtFr
37b90 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20  om into pBtTo.  
37ba0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  A transaction.**
37bb0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
37bc0 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a  for both files..
37bd0 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
37be0 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62  f file pTo may b
37bf0 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
37c00 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
37c10 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
37c20 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
37c30 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69  saction on pTo i
37c40 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a  s rolled back. .
37c50 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
37c60 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65  ful, CommitPhase
37c70 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c  One() may be cal
37c80 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72  led on pTo befor
37c90 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a  e returning. .**
37ca0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
37cb0 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74  ld finish commit
37cc0 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
37cd0 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63  tion on pTo by c
37ce0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
37cf0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a  3BtreeCommit()..
37d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
37d10 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
37d20 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
37d30 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  From){.  int rc 
37d40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
37d50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e  gno i;..  Pgno n
37d60 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a  FromPage;     /*
37d70 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
37d80 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50   in pFrom */.  P
37d90 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20  gno nToPage;    
37da0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37db0 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a  pages in pTo */.
37dc0 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b    Pgno nNewPage;
37dd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
37de0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
37df0 61 66 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a  after the copy *
37e00 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b  /..  Pgno iSkip;
37e10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64           /* Pend
37e20 69 6e 67 20 62 79 74 65 20 70 61 67 65 20 69 6e  ing byte page in
37e30 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54   pTo */.  int nT
37e40 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a  oPageSize;    /*
37e50 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54   Page size of pT
37e60 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  o in bytes */.  
37e70 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  int nFromPageSiz
37e80 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  e;  /* Page size
37e90 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74   of pFrom in byt
37ea0 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65  es */..  BtShare
37eb0 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e  d *pBtTo = pTo->
37ec0 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pBt;.  BtShared 
37ed0 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  *pBtFrom = pFrom
37ee0 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e  ->pBt;.  pBtTo->
37ef0 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
37f00 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46  pBtFrom->db = pF
37f10 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50  rom->db;..  nToP
37f20 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d  ageSize = pBtTo-
37f30 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72  >pageSize;.  nFr
37f40 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  omPageSize = pBt
37f50 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  From->pageSize;.
37f60 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72  .  if( pTo->inTr
37f70 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
37f80 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61   || pFrom->inTra
37f90 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
37fa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
37fb0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
37fc0 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75    if( pBtTo->pCu
37fd0 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
37fe0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
37ff0 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d    }..  nToPage =
38000 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
38010 70 42 74 54 6f 29 3b 0a 20 20 6e 46 72 6f 6d 50  pBtTo);.  nFromP
38020 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
38030 6f 75 6e 74 28 70 42 74 46 72 6f 6d 29 3b 0a 20  ount(pBtFrom);. 
38040 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47   iSkip = PENDING
38050 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
38060 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
38070 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68  e nNewPage is th
38080 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
38090 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
380a0 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  ore the.  ** con
380b0 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75  tents of pFrom u
380c0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
380d0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54   page-size of pT
380e0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61  o..  */.  nNewPa
380f0 67 65 20 3d 20 28 50 67 6e 6f 29 0a 20 20 20 20  ge = (Pgno).    
38100 20 28 28 28 69 36 34 29 6e 46 72 6f 6d 50 61 67   (((i64)nFromPag
38110 65 2a 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65  e*(i64)nFromPage
38120 53 69 7a 65 2b 28 69 36 34 29 6e 54 6f 50 61 67  Size+(i64)nToPag
38130 65 53 69 7a 65 2d 31 29 2f 28 69 36 34 29 6e 54  eSize-1)/(i64)nT
38140 6f 50 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 66  oPageSize);..  f
38150 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
38160 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54 6f  TE_OK && (i<=nTo
38170 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50  Page || i<=nNewP
38180 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  age); i++){..   
38190 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65 20   /* Journal the 
381a0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a 20  original page.. 
381b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53 6b     **.    ** iSk
381c0 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ip is the page n
381d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f 63  umber of the loc
381e0 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44 49  king page (PENDI
381f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20 20  NG_BYTE_PAGE).  
38200 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65    ** in database
38210 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74 68   *pTo (before th
38220 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70 61  e copy). This pa
38230 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  ge is never writ
38240 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ten .    ** into
38250 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
38260 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53 6b  e. Unless i==iSk
38270 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20 77  ip or the page w
38280 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72  as not.    ** pr
38290 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65 66  esent in pTo bef
382a0 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70 65  ore the copy ope
382b0 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20  ration, journal 
382c0 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f 2e  page i from pTo.
382d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
382e0 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e  i!=iSkip && i<=n
382f0 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ToPage ){.      
38300 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
38310 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
38320 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
38330 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69  pBtTo->pPager, i
38340 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
38350 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38370 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
38380 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
38390 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
383a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e  =SQLITE_OK && i>
383b0 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
383c0 20 20 20 20 20 20 20 2f 2a 20 59 65 61 68 2e 20         /* Yeah. 
383d0 20 49 74 20 73 65 65 6d 73 20 77 69 65 72 64 20   It seems wierd 
383e0 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74  to call DontWrit
383f0 65 28 29 20 72 69 67 68 74 20 61 66 74 65 72 20  e() right after 
38400 57 72 69 74 65 28 29 2e 20 42 75 74 0a 20 20 20  Write(). But.   
38410