/ Hex Artifact Content
Login

Artifact f695109b39fc104bd2f904b1a2d483d44faf9c86:


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 35 32 20 32 30 30 38 2f 31  c,v 1.552 2008/1
0190: 32 2f 32 33 20 31 35 3a 35 38 3a 30 36 20 64 72  2/23 15:58:06 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 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
8e90: 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ow==0 || sqlite3
8ea0: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
8eb0: 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  t(pPage->pDbPage
8ec0: 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  )>1 );.    asser
8ed0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
8ee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8ef0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8f00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
8f20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
8f30: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
8f40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8f50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8f60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8f70: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
8f80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8f90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8fa0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8fb0: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
8fc0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
8fd0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
8fe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
8ff0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
9000: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
9010: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
9020: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
9030: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
9040: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
9050: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
9060: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
9070: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
9080: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
9090: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
90a0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
90b0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
90c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
90d0: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
90e0: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
90f0: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
9100: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
9110: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
9120: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
9130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
9140: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
9150: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
9160: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
9170: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
9180: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9190: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66  tra(pData);.  if
91a0: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
91b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
91c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
91d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
91e0: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
91f0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
9200: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
9210: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
9220: 70 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20 20  pData)>0 ){.    
9230: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
9240: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
9250: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9260: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
9270: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
9280: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
9290: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
92a0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
92b0: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
92c0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
92d0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
92e0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
92f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9300: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
9310: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
9320: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
9330: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
9340: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
9350: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
9360: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
9370: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
9380: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
9390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
93a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
93b0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
93c0: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
93d0: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
93e0: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
93f0: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
9400: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
9410: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
9420: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
9430: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
9440: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
9450: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
9460: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
9470: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
9480: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
9490: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
94a0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
94b0: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
94c0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
94d0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
94e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
94f0: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
9500: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
9510: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
9520: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
9530: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
9540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
9550: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
9560: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
9570: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
9580: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9590: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
95a0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
95b0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95d0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
95e0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
95f0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
9600: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
9610: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
9620: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
9630: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
9640: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
9650: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
9660: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
9670: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
9680: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
9690: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
96a0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
96b0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
96c0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
96d0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
96e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
96f0: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 0a 20 20   u8 nReserve;.  
9700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
9710: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20  bHeader[100];.. 
9720: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
9730: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
9740: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
9750: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
9760: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
9770: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
9780: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
9790: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
97a0: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
97b0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
97c0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
97d0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
97e0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
97f0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
9800: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
9810: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9820: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
9830: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
9840: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9850: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
9860: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9870: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
9880: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
9890: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
98a0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
98b0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
98c0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
98d0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
98e0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
98f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
9900: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9910: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
9920: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
9930: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
9940: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
9950: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
9960: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
9970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9980: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9990: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
99a0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
99b0: 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65  b = db;..#if !de
99c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
99d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
99e0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
99f0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
9a00: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
9a10: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
9a20: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
9a30: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
9a40: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
9a50: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
9a60: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
9a70: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
9a80: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
9a90: 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c  =0.   && (db->fl
9aa0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61  ags & SQLITE_Vta
9ab0: 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c  b)==0.   && zFil
9ac0: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
9ad0: 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69  me[0].  ){.    i
9ae0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
9af0: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
9b00: 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
9b10: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
9b20: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
9b30: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
9b40: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
9b50: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
9b60: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
9b70: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
9b80: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
9b90: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e  hared;.      p->
9ba0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
9bb0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9bc0: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
9bd0: 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  che;.      if( !
9be0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
9bf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9c00: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
9c10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
9c30: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
9c40: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
9c50: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
9c60: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
9c70: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
9c80: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
9c90: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
9ca0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
9cb0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
9cc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
9cd0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
9ce0: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
9cf0: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
9d00: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
9d10: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
9d20: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
9d30: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
9d40: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
9d60: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
9d70: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
9d80: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
9d90: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
9db0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
9dc0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
9dd0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  s ){.          p
9de0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
9df0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
9e00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
9e10: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9e30: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9e40: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9e50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9e60: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
9e70: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9e80: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
9e90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
9ea0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
9eb0: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
9ec0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
9ed0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
9ee0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
9ef0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
9f00: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
9f10: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
9f20: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
9f30: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
9f40: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
9f50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9f60: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
9f70: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
9f80: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
9f90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9fa0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9fb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9fc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
9fd0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
9fe0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
9ff0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
a000: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
a010: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
a020: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
a030: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
a040: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
a050: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
a060: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
a070: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
a080: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
a090: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
a0a0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
a0b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
a0c0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
a0d0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
a0e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
a0f0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
a100: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
a110: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
a120: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
a130: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
a140: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
a150: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
a160: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
a170: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
a180: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
a190: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
a1a0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
a1b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a1c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
a1d0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
a1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
a1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
a200: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
a210: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
a220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a230: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
a240: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
a250: 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  sFlags);.    if(
a260: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a270: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a280: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
a290: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
a2a0: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
a2b0: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
a2c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a2d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a2e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
a2f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
a300: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
a310: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
a320: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
a330: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
a340: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
a350: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
a360: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
a370: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
a380: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
a390: 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e  init);.    pBt->
a3a0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
a3b0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
a3c0: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
a3d0: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
a3e0: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
a3f0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
a400: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67  Bt->pageSize = g
a410: 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64  et2byte(&zDbHead
a420: 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  er[16]);.    if(
a430: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
a440: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
a450: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
a460: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
a470: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
a480: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
a490: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
a4a0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
a4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
a4c0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a4d0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
a4e0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
a4f0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a500: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
a510: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
a520: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
a530: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
a540: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
a550: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
a560: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
a570: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
a580: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
a590: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
a5a0: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
a5b0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
a5c0: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
a5d0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
a5e0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
a5f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
a600: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
a610: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
a620: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
a630: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
a640: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
a650: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
a660: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
a670: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
a680: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a690: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
a6a0: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
a6b0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
a6c0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
a6d0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a6e0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
a6f0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
a700: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
a710: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a720: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
a730: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a740: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
a750: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a760: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
a770: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
a780: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
a790: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
a7a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a7b0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
a7c0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
a7d0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
a7e0: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
a7f0: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
a800: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
a810: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
a820: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
a830: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
a840: 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  }.    pBt->usabl
a850: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
a860: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
a870: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
a880: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
a890: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
a8a0: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
a8b0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20  pageSize */.    
a8c0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
a8d0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
a8e0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
a8f0: 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64  ize);.   .#if !d
a900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a910: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
a920: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a930: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
a940: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
a950: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
a960: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
a970: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
a980: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
a990: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
a9a0: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  rable ){.      s
a9b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
a9c0: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
a9d0: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
a9e0: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
a9f0: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
aa00: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
aa10: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
aa20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
aa30: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
aa40: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
aa50: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
aa60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
aa70: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
aa80: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
aa90: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
aaa0: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
aab0: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
aac0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
aad0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
aae0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
aaf0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
ab00: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
ab10: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
ab20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ab30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ab40: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
ab50: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
ab60: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
ab70: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
ab80: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
ab90: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
aba0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
abb0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
abc0: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
abd0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
abe0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
abf0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
ac00: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
ac10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ac20: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
ac30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
ac40: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
ac50: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
ac60: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
ac70: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
ac80: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
ac90: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
aca0: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
acb0: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
acc0: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
acd0: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
ace0: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
acf0: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
ad00: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
ad10: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
ad20: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
ad30: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
ad40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ad50: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
ad60: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
ad70: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
ad80: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
ad90: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
ada0: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
adb0: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
adc0: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
add0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
ade0: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
adf0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
ae00: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ae10: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
ae20: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
ae30: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
ae40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae50: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
ae60: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
ae70: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
ae80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ae90: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
aea0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
aeb0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
aec0: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
aed0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
aee0: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
aef0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
af00: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
af10: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
af20: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
af30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
af40: 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
af50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
af70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
af80: 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
af90: 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
afa0: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
afb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
afc0: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
afd0: 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
afe0: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
aff0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
b000: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b010: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
b020: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
b030: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
b040: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b050: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
b060: 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
b070: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
b080: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
b090: 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
b0a0: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
b0b0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
b0c0: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
b0d0: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
b0e0: 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
b0f0: 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
b100: 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
b110: 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
b120: 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
b130: 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
b140: 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
b150: 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
b160: 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
b170: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b180: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71  HARED_CACHE.  sq
b190: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
b1a0: 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64  ster;.  BtShared
b1b0: 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
b1c0: 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
b1d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b1e0: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
b1f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d  ->mutex) );.  pM
b200: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
b210: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
b220: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
b230: 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33  STER);.  sqlite3
b240: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
b250: 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
b260: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
b270: 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
b280: 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
b290: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
b2a0: 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
b2b0: 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
b2c0: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
b2d0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
b2e0: 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
b2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b300: 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
b310: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
b320: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
b330: 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
b340: 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
b350: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
b360: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
b370: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
b380: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
b390: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
b3a0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
b3b0: 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
b3c0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
b3d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
b3e0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
b3f0: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
b400: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
b410: 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
b420: 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
b430: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b440: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
b450: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
b460: 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
b470: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
b480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
b490: 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
b4a0: 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
b4b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
b4c0: 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
b4d0: 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  Bt) bytes..*/.st
b4e0: 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
b4f0: 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
b500: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
b510: 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
b520: 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
b530: 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
b540: 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
b550: 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
b560: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b570: 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
b580: 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
b590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
b5a0: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
b5b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
b5c0: 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42  ite3PageFree( pB
b5d0: 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
b5e0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
b5f0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
b600: 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
b610: 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
b620: 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
b630: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b640: 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
b650: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
b660: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
b670: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
b680: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
b690: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
b6a0: 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
b6b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
b6c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b6d0: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b6e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b6f0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
b700: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
b710: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
b720: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
b730: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
b740: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
b750: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
b760: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
b770: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
b780: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b790: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
b7a0: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
b7b0: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
b7c0: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
b7d0: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
b7e0: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
b7f0: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
b800: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b810: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
b820: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
b830: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
b840: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
b850: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
b860: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
b870: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b880: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
b890: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
b8a0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
b8b0: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
b8c0: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
b8d0: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
b8e0: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
b8f0: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
b900: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
b910: 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
b920: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
b930: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b940: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
b950: 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
b960: 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
b970: 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
b980: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
b990: 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
b9a0: 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
b9b0: 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
b9c0: 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
b9d0: 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
b9e0: 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
b9f0: 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
ba00: 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
ba10: 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
ba20: 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
ba30: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
ba40: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ba50: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
ba60: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
ba70: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
ba80: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
ba90: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
baa0: 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
bab0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
bac0: 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
bad0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
bae0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
baf0: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
bb00: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
bb10: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
bb20: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
bb30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bb40: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
bb50: 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
bb60: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
bb70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
bb80: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
bb90: 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
bba0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
bbb0: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
bbc0: 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
bbd0: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
bbe0: 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
bbf0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
bc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bc10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
bc20: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
bc30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
bc40: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
bc50: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
bc60: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
bc70: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
bc80: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
bc90: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
bca0: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
bcb0: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
bcc0: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
bcd0: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
bce0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
bcf0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
bd00: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
bd10: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
bd20: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
bd30: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
bd40: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
bd50: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
bd60: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
bd70: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
bd80: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
bd90: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
bda0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
bdb0: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
bdc0: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
bdd0: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
bde0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
bdf0: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
be00: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
be10: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
be20: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
be30: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
be40: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
be50: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
be60: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
be70: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
be80: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
be90: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
bea0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
beb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
bec0: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
bed0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
bee0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
bef0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
bf00: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
bf10: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
bf20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
bf30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
bf40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
bf50: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
bf60: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
bf70: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
bf80: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
bf90: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
bfa0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
bfb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bfc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
bfd0: 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
bfe0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
bff0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
c000: 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
c010: 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
c020: 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
c030: 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
c040: 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
c050: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
c060: 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
c070: 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
c080: 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
c090: 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
c0a0: 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
c0b0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
c0c0: 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
c0d0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
c0e0: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
c0f0: 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
c100: 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
c110: 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
c120: 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
c130: 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
c140: 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
c150: 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
c160: 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
c170: 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
c180: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c190: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
c1a0: 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
c1b0: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
c1c0: 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
c1d0: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
c1e0: 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
c1f0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
c200: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c210: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
c220: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
c230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c240: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
c250: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
c260: 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
c270: 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
c280: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c290: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c2a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c2b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
c2c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
c2d0: 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
c2e0: 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
c2f0: 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
c300: 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
c310: 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
c320: 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
c330: 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
c340: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c350: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
c360: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
c370: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
c380: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
c390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c3a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
c3b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
c3c0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c3d0: 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
c3e0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
c3f0: 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
c400: 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
c410: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
c420: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c430: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c440: 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
c450: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
c460: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
c470: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c480: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
c490: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
c4a0: 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
c4b0: 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
c4c0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
c4d0: 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a  es per page..**.
c4e0: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
c4f0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
c500: 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
c510: 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
c520: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
c530: 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
c540: 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
c550: 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
c560: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
c570: 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
c580: 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
c590: 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
c5a0: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
c5b0: 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
c5c0: 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
c5d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c5e0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
c5f0: 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
c600: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
c610: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
c620: 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
c630: 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
c640: 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
c650: 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
c660: 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
c670: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
c680: 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
c690: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
c6a0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
c6b0: 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
c6c0: 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
c6d0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
c6e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c6f0: 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
c700: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
c710: 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
c720: 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
c730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
c740: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
c750: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
c760: 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
c770: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
c780: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c790: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
c7a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c7b0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
c7c0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c7d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c7e0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
c7f0: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
c800: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
c810: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c820: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
c830: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
c840: 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
c850: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
c860: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
c870: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
c880: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
c890: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
c8a0: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
c8b0: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
c8c0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
c8d0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
c8e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
c8f0: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
c900: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
c910: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
c920: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
c930: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
c940: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
c950: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
c960: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
c970: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
c980: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
c990: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c9b0: 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
c9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c9d0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c9e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
c9f0: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
ca00: 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
ca10: 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
ca20: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
ca30: 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
ca40: 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
ca50: 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73  ageSize;.}.int s
ca60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
ca70: 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
ca80: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
ca90: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
caa0: 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
cab0: 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
cac0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
cad0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
cae0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
caf0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
cb00: 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
cb10: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
cb20: 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
cb30: 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
cb40: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
cb50: 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
cb60: 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
cb70: 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
cb80: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
cb90: 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
cba0: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
cbb0: 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
cbc0: 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
cbd0: 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
cbe0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
cbf0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
cc00: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
cc10: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
cc20: 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
cc30: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
cc40: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
cc50: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
cc60: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69  eturn n;.}.#endi
cc70: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
cc80: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
cc90: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
cca0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ccb0: 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
ccc0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
ccd0: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
cce0: 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
ccf0: 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
cd00: 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
cd10: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
cd20: 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
cd30: 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
cd40: 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
cd50: 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
cd60: 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
cd70: 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
cd80: 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
cd90: 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
cda0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
cdb0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
cdc0: 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
cdd0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
cde0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
cdf0: 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
ce00: 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
ce10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ce20: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
ce30: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
ce40: 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
ce50: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
ce60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ce70: 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 61  _OK;.  u8 av = a
ce80: 75 74 6f 56 61 63 75 75 6d 20 3f 31 3a 30 3b 0a  utoVacuum ?1:0;.
ce90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
cea0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
ceb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
cec0: 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75  d && av!=pBt->au
ced0: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
cee0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
cef0: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
cf00: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
cf10: 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73  um = av;.  }.  s
cf20: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
cf30: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
cf40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
cf50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
cf60: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
cf70: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
cf80: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
cf90: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
cfa0: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
cfb0: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
cfc0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
cfd0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
cfe0: 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
cff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d000: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
d010: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
d020: 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
d030: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
d040: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
d050: 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
d060: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
d070: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
d080: 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
d090: 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
d0a0: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
d0b0: 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
d0c0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
d0d0: 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
d0e0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
d0f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
d100: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
d110: 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
d120: 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
d130: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
d140: 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
d150: 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
d160: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
d170: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
d180: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
d190: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
d1a0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
d1b0: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
d1c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
d1d0: 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
d1e0: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
d1f0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
d200: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
d210: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
d220: 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
d230: 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
d240: 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
d250: 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
d260: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
d270: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
d280: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
d290: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
d2a0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20  .  int nPage;.. 
d2b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d2c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d2d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
d2e0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72   pBt->pPage1 ) r
d2f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d300: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
d310: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
d320: 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
d330: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d340: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
d350: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
d360: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
d370: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
d380: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
d390: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
d3a0: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
d3b0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71   .  */.  rc = sq
d3c0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
d3d0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
d3e0: 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
d3f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d400: 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f  .    goto page1_
d410: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  init_failed;.  }
d420: 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30  else if( nPage>0
d430: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65   ){.    int page
d440: 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73  Size;.    int us
d450: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
d460: 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
d470: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
d480: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
d490: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
d4a0: 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
d4b0: 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
d4c0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
d4d0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
d4e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
d4f0: 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
d500: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
d510: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
d520: 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
d530: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d540: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d550: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
d560: 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
d570: 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
d580: 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
d590: 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
d5a0: 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
d5b0: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
d5c0: 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
d5d0: 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
d5e0: 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
d5f0: 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
d600: 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
d610: 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
d620: 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
d630: 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
d640: 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
d650: 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
d660: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
d670: 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
d680: 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
d690: 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
d6a0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d6b0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d6c0: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
d6d0: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
d6e0: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
d6f0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
d700: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
d710: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20  eSize<512 ||.   
d720: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58       (SQLITE_MAX
d730: 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38  _PAGE_SIZE<32768
d740: 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   && pageSize>SQL
d750: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
d760: 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
d770: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d780: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
d790: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
d7a0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
d7b0: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
d7c0: 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
d7d0: 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61  [20];.    if( pa
d7e0: 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
d7f0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
d800: 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
d810: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
d820: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
d830: 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
d840: 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
d850: 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
d860: 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
d870: 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
d880: 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
d890: 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
d8a0: 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
d8b0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
d8c0: 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
d8d0: 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
d8e0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d8f0: 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
d900: 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
d910: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
d920: 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
d930: 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
d940: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
d950: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
d960: 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
d970: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
d980: 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
d990: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
d9a0: 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
d9b0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
d9c0: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
d9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
d9e0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
d9f0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
da00: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
da10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
da20: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
da30: 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30  ( usableSize<500
da40: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
da50: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
da60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
da70: 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
da80: 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70  )pageSize;.    p
da90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
daa0: 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
dab0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
dac0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
dad0: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
dae0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
daf0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
db00: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
db10: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
db20: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
db30: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
db40: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
db50: 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
db60: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
db70: 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
db80: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
db90: 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
dba0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
dbb0: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
dbc0: 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
dbd0: 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
dbe0: 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
dbf0: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
dc00: 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
dc10: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
dc20: 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
dc30: 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
dc40: 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
dc50: 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
dc60: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
dc70: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
dc80: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
dc90: 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
dca0: 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
dcb0: 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
dcc0: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
dcd0: 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
dce0: 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
dcf0: 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
dd00: 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
dd10: 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
dd20: 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
dd30: 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
dd40: 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
dd50: 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
dd60: 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
dd70: 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
dd80: 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
dd90: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
dda0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
ddb0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
ddc0: 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
ddd0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
dde0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
ddf0: 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
de00: 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
de10: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
de20: 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
de30: 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
de40: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
de50: 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
de60: 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
de70: 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
de80: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
de90: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
dea0: 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
deb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
dec0: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
ded0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
dee0: 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
def0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
df00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
df10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
df20: 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65  ks like lockBtre
df30: 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
df40: 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20  it also invokes 
df50: 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c  the.** busy call
df60: 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  back if there is
df70: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
df80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
df90: 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
dfa0: 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b  ry(Btree *pRef){
dfb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dfc0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
dfd0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
dfe0: 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29  ldsMutex(pRef) )
dff0: 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e  ;.  if( pRef->in
e000: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
e010: 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72  E ){.    u8 inTr
e020: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66  ansaction = pRef
e030: 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
e040: 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49  tion;.    btreeI
e050: 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
e060: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e070: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
e080: 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52  pRef, 0);.    pR
e090: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
e0a0: 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73  action = inTrans
e0b0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66  action;.    pRef
e0c0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
e0d0: 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20  S_NONE;.    if( 
e0e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e0f0: 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74  .      pRef->pBt
e100: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
e110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
e120: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
e130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
e140: 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a  c;.}.       ../*
e150: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
e160: 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
e170: 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
e180: 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
e190: 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
e1a0: 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
e1b0: 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
e1c0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
e1d0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
e1e0: 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
e1f0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
e200: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e210: 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
e220: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
e230: 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
e240: 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
e250: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
e260: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
e270: 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
e280: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
e290: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
e2a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
e2b0: 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
e2c0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
e2d0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
e2e0: 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
e2f0: 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
e300: 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
e310: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e320: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
e330: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
e340: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
e350: 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
e360: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74  Cursor==0 && pBt
e370: 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
e380: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
e390: 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
e3a0: 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20  >pPager)>=1 ){. 
e3b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
e3c0: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
e3d0: 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69  );.#if 0.      i
e3e0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
e3f0: 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
e400: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
e410: 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
e420: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
e430: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
e440: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
e450: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
e460: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74        pPage->pBt
e470: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
e480: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b  pPage->pgno = 1;
e490: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
e4a0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
e4b0: 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
e4c0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
e4d0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
e4e0: 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
e4f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
e500: 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
e510: 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
e520: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
e530: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
e540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e550: 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
e560: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
e570: 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
e580: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e590: 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
e5a0: 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
e5b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e5c0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e5d0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
e5e0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
e5f0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
e600: 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
e610: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
e620: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
e630: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
e640: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
e650: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
e660: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
e670: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
e680: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e690: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
e6a0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
e6b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
e6c0: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
e6d0: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
e6e0: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
e6f0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e700: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
e710: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
e720: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
e730: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
e740: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
e750: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
e760: 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
e770: 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
e780: 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
e790: 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
e7a0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
e7b0: 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
e7c0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
e7d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
e7e0: 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
e7f0: 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
e800: 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
e810: 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
e820: 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
e830: 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
e840: 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
e850: 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
e860: 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
e870: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
e880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e890: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e8a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
e8b0: 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
e8c0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
e8d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e8e0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
e8f0: 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
e900: 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
e910: 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
e920: 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
e930: 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
e940: 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
e950: 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
e960: 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
e970: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e980: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
e990: 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
e9a0: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
e9b0: 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
e9c0: 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
e9d0: 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
e9e0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
e9f0: 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
ea00: 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
ea10: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
ea20: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
ea30: 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
ea40: 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
ea50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
ea60: 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
ea70: 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
ea80: 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
ea90: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
eaa0: 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
eab0: 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
eac0: 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
ead0: 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
eae0: 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
eaf0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
eb00: 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
eb10: 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
eb20: 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
eb30: 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
eb40: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
eb50: 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
eb60: 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
eb70: 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
eb80: 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
eb90: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
eba0: 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
ebb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
ebc0: 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
ebd0: 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
ebe0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
ebf0: 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
ec00: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
ec10: 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
ec20: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
ec30: 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
ec40: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ec50: 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
ec60: 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
ec70: 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
ec80: 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
ec90: 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
eca0: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
ecb0: 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
ecc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
ecd0: 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
ece0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
ecf0: 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
ed00: 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
ed10: 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
ed20: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
ed30: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
ed40: 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
ed50: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
ed60: 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
ed70: 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
ed80: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
ed90: 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
eda0: 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
edb0: 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
edc0: 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
edd0: 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
ede0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
edf0: 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
ee00: 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
ee10: 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
ee20: 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
ee30: 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
ee40: 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
ee50: 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
ee60: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
ee70: 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
ee80: 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
ee90: 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
eea0: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
eeb0: 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
eec0: 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
eed0: 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
eee0: 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
eef0: 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
ef00: 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
ef10: 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
ef20: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
ef30: 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
ef40: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
ef50: 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
ef60: 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
ef70: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
ef80: 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
ef90: 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
efa0: 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
efb0: 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
efc0: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
efd0: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
efe0: 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
eff0: 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
f000: 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
f010: 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
f020: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
f030: 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
f040: 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
f050: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f060: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
f070: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f080: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
f090: 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
f0a0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74  db = p->db;.  bt
f0b0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
f0c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
f0d0: 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
f0e0: 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
f0f0: 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
f100: 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
f110: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
f120: 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
f130: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
f140: 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
f150: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
f160: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
f170: 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
f180: 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
f190: 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
f1a0: 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
f1b0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
f1c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
f1d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
f1e0: 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
f1f0: 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
f200: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
f210: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
f220: 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
f230: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
f240: 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
f250: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
f260: 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
f270: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
f280: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
f290: 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
f2a0: 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
f2b0: 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
f2c0: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
f2d0: 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
f2e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
f2f0: 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
f300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f310: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
f320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
f330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
f340: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
f350: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
f360: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
f370: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
f380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f390: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
f3a0: 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
f3b0: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
f3c0: 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
f3d0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
f3e0: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
f3f0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
f400: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
f410: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  p ){.        rc 
f420: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
f430: 20 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e         goto tran
f440: 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d  s_begun;.      }
f450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f460: 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66  f..  do {.    if
f470: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
f480: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
f490: 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42        rc = lockB
f4a0: 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20  tree(pBt);.     
f4b0: 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50   }while( pBt->pP
f4c0: 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53  age1==0 && rc==S
f4d0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
f4e0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
f4f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
f500: 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
f510: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
f520: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
f530: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
f540: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f550: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f560: 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
f570: 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c  pPage1->pDbPage,
f580: 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20   wrflag>1);.    
f590: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f5a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f5b0: 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
f5c0: 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
f5d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f5e0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d  }.  .    if( rc=
f5f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f600: 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
f610: 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
f620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f630: 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
f640: 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
f650: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
f660: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
f670: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f680: 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
f690: 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
f6a0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
f6b0: 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
f6c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f6d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
f6e0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
f6f0: 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
f700: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
f710: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
f720: 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
f730: 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
f740: 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
f750: 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
f760: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
f770: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
f780: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
f790: 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69  nTrans;.    }.#i
f7a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f7b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
f7c0: 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
f7d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f7e0: 20 21 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76   !pBt->pExclusiv
f7f0: 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
f800: 70 45 78 63 6c 75 73 69 76 65 20 3d 20 70 3b 0a  pExclusive = p;.
f810: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f820: 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
f830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f840: 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
f850: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
f860: 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
f870: 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
f880: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
f890: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
f8a0: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
f8b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
f8c0: 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
f8d0: 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
f8e0: 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
f8f0: 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
f900: 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
f910: 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
f920: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
f930: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f940: 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
f950: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
f960: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
f970: 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
f980: 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
f990: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f9a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f9b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f9c0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f9d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f9e0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
f9f0: 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
fa00: 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
fa10: 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
fa20: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
fa30: 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
fa40: 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
fa50: 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
fa60: 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
fa70: 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
fa80: 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
fa90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
faa0: 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
fab0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
fac0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
faf0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
fb00: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
fb30: 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
fb40: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
fb70: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
fb80: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fb90: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
fba0: 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
fbb0: 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
fbc0: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
fbd0: 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
fbe0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fbf0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
fc00: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
fc10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
fc20: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
fc30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fc40: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
fc50: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
fc60: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
fc70: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
fc80: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
fc90: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
fca0: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
fcb0: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
fcc0: 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
fcd0: 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
fce0: 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
fcf0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fd00: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
fd10: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
fd20: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
fd30: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
fd40: 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
fd50: 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
fd60: 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
fd70: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
fd80: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
fd90: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
fda0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
fdb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fdc0: 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
fdd0: 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
fde0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
fdf0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
fe00: 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
fe10: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
fe20: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
fe30: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
fe40: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
fe50: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
fe60: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
fe70: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
fe80: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
fe90: 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
fea0: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
feb0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fec0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
fed0: 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
fee0: 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
fef0: 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
ff00: 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
ff10: 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
ff20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
ff30: 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
ff40: 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
ff50: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
ff60: 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
ff70: 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
ff80: 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
ff90: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
ffa0: 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
ffb0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
ffc0: 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
ffd0: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
ffe0: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
fff0: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
10000 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
10010 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
10020 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
10030 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
10040 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
10050 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
10060 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
10070 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
100a0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
100b0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
100c0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
100d0 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
100e0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
100f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
10100 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
10110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10120 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
10130 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
10140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
10150 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
10160 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10170 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
10180 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
10190 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
101a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
101b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
101c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
101d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
101e0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
101f0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
10200 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
10210 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
10220 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
10230 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
10240 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
10250 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
10260 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
10270 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
10280 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
10290 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
102a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
102b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
102c0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
102d0 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
102e0 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
102f0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
10300 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
10310 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
10320 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10330 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
10340 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
10350 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
10360 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
10370 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
10380 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
10390 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
103a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
103b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
103c0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
103d0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
103e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
103f0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
10400 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
10410 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
10420 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
10430 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
10440 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
10450 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
10460 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
10470 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
10480 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
10490 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
104a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
104b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
104c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
104d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
104e0 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
104f0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
10500 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
10510 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
10520 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10540 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
10550 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
10560 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
10570 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
10580 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
10590 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
105a0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
105b0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
105c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
105d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
105e0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
105f0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
10600 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
10610 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
10620 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
10630 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
10640 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
10650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
10660 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
10670 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
10680 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
10690 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
106a0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
106b0 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
106c0 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
106d0 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  ns valid..*/.sta
106e0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
106f0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10700 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
10710 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
10720 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
10730 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
10740 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
10750 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10770 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
10780 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
10790 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
107a0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
107b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
107c0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
107d0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
107e0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
107f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10800 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
10810 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
10820 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29    int isCommit.)
10830 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
10840 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
10850 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
10860 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
10870 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
10880 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
10890 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
108a0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
108b0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
108c0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
108d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
108e0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
108f0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
10900 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
10910 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
10920 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
10930 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
10940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10950 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10960 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10970 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
10980 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
10990 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
109a0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
109b0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
109c0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
109d0 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
109e0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
109f0 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
10a00 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
10a10 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
10a20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
10a30 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
10a40 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
10a50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10a60 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
10a70 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
10a80 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
10a90 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
10aa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10ab0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10ac0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
10ad0 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
10ae0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
10af0 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
10b00 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
10b10 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
10b20 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
10b30 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
10b40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
10b50 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
10b60 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
10b70 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
10b80 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
10b90 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
10ba0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
10bb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
10bc0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
10bd0 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
10be0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
10bf0 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
10c00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
10c10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
10c20 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
10c30 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
10c40 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
10c50 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
10c60 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
10c70 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
10c80 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
10c90 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
10ca0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
10cb0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
10cc0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
10cd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10d00 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
10d10 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
10d20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
10d30 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
10d40 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
10d50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
10d60 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
10d70 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
10d80 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
10d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10dd0 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
10de0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
10df0 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
10e00 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
10e10 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
10e20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
10e30 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
10e40 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
10e50 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
10e60 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
10e70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
10e80 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
10e90 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
10ea0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
10eb0 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
10ec0 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
10ed0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10f00 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
10f10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
10f20 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
10f30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10f50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
10f60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
10f70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10f80 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
10f90 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
10fa0 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
10fb0 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
10fc0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10fd0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
10fe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10ff0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
11000 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
11010 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
11020 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
11030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11040 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
11050 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
11060 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
11070 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
11080 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
11090 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
110a0 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
110b0 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
110c0 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
110d0 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
110e0 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
110f0 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
11100 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
11110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11120 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
11130 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
11140 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
11150 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
11160 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
11170 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
11180 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
11190 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
111a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
111b0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
111c0 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
111d0 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
111e0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
111f0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
11200 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
11210 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
11220 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
11230 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
11240 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69   non-zero, the i
11250 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
11260 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
11270 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
11280 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
11290 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
112a0 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
112b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
112c0 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
112d0 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
112e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
112f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11300 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
11310 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
11320 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
11330 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
11340 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
11350 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
11360 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67  Pgno nFin){.  Pg
11370 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20  no iLastPg;     
11380 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
11390 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
113a0 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  base */.  Pgno n
113b0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
113c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
113d0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
113e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
113f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11400 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11410 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11420 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e  iLastPg = pBt->n
11430 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61  Trunc;.  if( iLa
11440 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  stPg==0 ){.    i
11450 4c 61 73 74 50 67 20 3d 20 70 61 67 65 72 50 61  LastPg = pagerPa
11460 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
11470 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  }..  if( !PTRMAP
11480 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
11490 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
114a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
114b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
114c0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
114d0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
114e0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
114f0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
11500 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11510 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
11520 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
11530 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
11540 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
11550 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
11560 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
11570 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
11580 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
11590 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
115a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
115b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
115c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
115d0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
115e0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
115f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11600 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11610 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
11620 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
11630 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
11640 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
11650 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
11660 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
11670 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
11680 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
11690 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
116a0 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
116b0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
116c0 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
116d0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
116e0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
116f0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
11700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11710 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
11720 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
11730 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
11740 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
11750 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
11760 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
11770 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
11780 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
11790 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
117a0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
117b0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
117c0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
117d0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
117e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
117f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11800 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11810 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
11830 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
11840 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
11850 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
11860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
11870 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
11880 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
11890 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
118a0 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
118b0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
118c0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
118d0 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
118e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
118f0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
11900 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
11910 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
11920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11930 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11940 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
11950 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
11960 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
11970 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
11980 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
11990 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
119a0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
119b0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
119c0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
119d0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
119e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
119f0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
11a00 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
11a10 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
11a20 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
11a30 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
11a40 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
11a50 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
11a60 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
11a70 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
11a80 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
11a90 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
11aa0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
11ab0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
11ac0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
11ad0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
11ae0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
11af0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
11b00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11b10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
11b30 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
11b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
11b60 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
11b70 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
11b80 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
11b90 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
11ba0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
11bb0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
11bc0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
11bd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
11be0 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
11bf0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
11c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
11c20 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
11c30 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
11c40 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
11c50 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20  , nFin!=0);.    
11c60 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
11c70 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
11c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11cc0 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d  .  pBt->nTrunc =
11cd0 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20   iLastPg - 1;.  
11ce0 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75  while( pBt->nTru
11cf0 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  nc==PENDING_BYTE
11d00 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
11d10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
11d20 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20  Bt->nTrunc) ){. 
11d30 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d     pBt->nTrunc--
11d40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11d50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11d60 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
11d70 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
11d80 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
11d90 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
11da0 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
11db0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
11dc0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
11dd0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
11de0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
11df0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
11e00 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
11e10 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
11e20 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
11e30 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
11e40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
11e50 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
11e60 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
11e70 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c   occured,.** SQL
11e80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11e90 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
11ea0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11eb0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
11ec0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
11ed0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
11ee0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
11ef0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11f00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11f10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
11f20 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
11f30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
11f40 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
11f50 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
11f60 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
11f70 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
11f80 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
11f90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11fa0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
11fb0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
11fc0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11fd0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63  t);.    rc = inc
11fe0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
11ff0 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
12000 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12010 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12030 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
12040 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
12050 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
12060 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
12070 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
12080 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
12090 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
120a0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
120b0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
120c0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
120d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
120e0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
120f0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
12100 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
12110 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
12120 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
12130 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
12140 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
12150 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
12160 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
12170 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
12180 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
12190 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
121a0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
121b0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a  red *pBt, Pgno *
121c0 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20  pnTrunc){.  int 
121d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
121e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
121f0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
12200 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
12210 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
12220 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
12230 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
12240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12250 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12260 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
12270 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
12280 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
12290 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
122a0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
122b0 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
122c0 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20  gno nFin = 0;.. 
122d0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
122e0 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50  nc==0 ){.      P
122f0 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20  gno nFree;.     
12300 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20   Pgno nPtrmap;. 
12310 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70       const int p
12320 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  gsz = pBt->pageS
12330 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ize;.      Pgno 
12340 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
12350 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20  ecount(pBt);..  
12360 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
12370 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
12380 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
12390 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
123a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
123b0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
123c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
123d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
123e0 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
123f0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
12400 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
12410 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
12420 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
12430 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
12440 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
12450 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
12460 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
12470 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
12480 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
12490 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
124a0 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
124b0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
124c0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
124d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
124e0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
124f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
12500 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
12510 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
12520 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
12530 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
12540 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
12550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12560 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
12570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12580 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
12590 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
125a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
125b0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
125c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
125d0 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
125e0 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
125f0 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
12600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12610 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
12620 70 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e  pBt->nTrunc && n
12630 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Fin ){.        r
12640 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12650 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
12660 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
12670 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
12680 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12690 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
126a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
126b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
126c0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  36], 0);.       
126d0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e   pBt->nTrunc = n
126e0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
126f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12710 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
12720 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
12730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
12740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12750 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d  {.    *pnTrunc =
12760 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
12770 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
12780 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
12790 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
127a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
127b0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
127c0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
127d0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
127e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
127f0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
12800 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
12810 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
12820 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
12830 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
12840 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
12850 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
12860 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
12870 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
12880 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
12890 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
128a0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
128b0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
128c0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
128d0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
128e0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
128f0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
12900 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
12910 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
12920 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
12930 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12940 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
12950 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
12960 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
12970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12980 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
12990 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
129a0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
129b0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
129c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
129d0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
129e0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
129f0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
12a00 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
12a10 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
12a20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
12a30 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
12a40 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
12a50 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
12a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
12a70 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
12a80 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
12a90 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72  treeCommit() for
12aa0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12ab0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
12ac0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
12ad0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
12ae0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
12af0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
12b00 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
12b10 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
12b20 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
12b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12b40 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
12b50 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
12b60 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
12b70 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
12b80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
12b90 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
12ba0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
12bb0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12bc0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
12bd0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
12be0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
12bf0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
12c00 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
12c10 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
12c20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
12c30 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
12c40 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
12c50 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
12c60 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
12c70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
12c80 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
12c90 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
12ca0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
12cb0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
12cc0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
12cd0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
12ce0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
12cf0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
12d00 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
12d10 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
12d20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
12d30 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
12d40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12d50 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
12d60 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
12d70 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
12d80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12d90 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
12da0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
12db0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
12dc0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12dd0 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d     Pgno nTrunc =
12de0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
12df0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12e00 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
12e10 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
12e20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12e30 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
12e40 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
12e50 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
12e60 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e  umCommit(pBt, &n
12e70 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69  Trunc); .      i
12e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12ea0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12eb0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12ec0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12ed0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
12ee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
12ef0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
12f00 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
12f10 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a  er, nTrunc, 0);.
12f20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12f30 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
12f40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12f50 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
12f60 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
12f70 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
12f80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12f90 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
12fa0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
12fb0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
12fc0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
12fd0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
12fe0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
12ff0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
13000 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
13010 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
13020 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
13030 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
13040 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
13050 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
13060 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
13070 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
13080 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
13090 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
130a0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
130b0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
130c0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
130d0 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
130e0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
130f0 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
13100 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
13110 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
13120 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
13130 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
13140 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
13150 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
13160 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
13170 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
13180 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
13190 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
131a0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
131b0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
131c0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
131d0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
131e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
131f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
13200 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
13210 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13220 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
13230 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13240 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13250 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
13260 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
13270 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
13280 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
13290 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
132a0 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
132b0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
132c0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
132d0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
132e0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
132f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
13300 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
13310 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
13320 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13330 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
13340 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
13350 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13360 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
13370 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13380 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
13390 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
133a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
133b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
133c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
133d0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
133e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
133f0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13400 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
13410 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
13420 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
13430 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
13440 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
13450 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
13460 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
13470 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
13480 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
13490 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
134a0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
134b0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
134c0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
134d0 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
134e0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
134f0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
13500 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
13510 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
13520 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
13530 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
13540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13550 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13560 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
13570 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
13580 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
13590 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
135a0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
135b0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
135c0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
135d0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
135e0 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
135f0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
13600 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
13610 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
13620 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
13630 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
13640 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
13650 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
13660 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61  .  */.  p->inTra
13670 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
13680 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
13690 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
136a0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
136b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
136c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
136d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
136e0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
136f0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
13700 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
13710 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
13720 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13730 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
13740 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
13750 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13760 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
13770 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
13780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13790 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
137a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
137b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
137c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
137d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
137e0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
137f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
13800 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
13810 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
13820 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
13830 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
13840 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
13850 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
13860 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
13870 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
13880 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
13890 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
138a0 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
138b0 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
138c0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
138d0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
138e0 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
138f0 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
13900 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
13910 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
13920 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
13930 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
13940 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
13950 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
13960 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
13970 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
13980 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
13990 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
139a0 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
139b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
139c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
139d0 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
139e0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
139f0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
13a00 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
13a10 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
13a20 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
13a30 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
13a40 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
13a50 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
13a60 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
13a70 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
13a80 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
13a90 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
13aa0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
13ab0 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
13ac0 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
13ad0 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
13ae0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
13af0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
13b00 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
13b10 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
13b20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
13b30 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
13b40 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
13b50 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
13b60 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
13b70 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
13b80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13b90 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
13ba0 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
13bb0 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
13bc0 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
13bd0 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
13be0 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
13bf0 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
13c00 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
13c10 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
13c20 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
13c30 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
13c40 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
13c50 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
13c60 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
13c70 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
13c80 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
13c90 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
13ca0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
13cb0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
13cc0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
13cd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13ce0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
13cf0 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
13d00 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
13d10 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
13d20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13d30 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
13d40 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
13d50 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
13d60 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
13d70 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
13d80 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
13d90 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
13da0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
13db0 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20  LT;.    p->skip 
13dc0 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
13dd0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
13de0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
13df0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
13e00 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
13e10 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
13e20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
13e30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13e40 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
13e50 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
13e60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13e70 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
13e80 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
13e90 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
13ea0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
13eb0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
13ec0 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
13ed0 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
13ee0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13ef0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
13f00 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
13f10 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
13f20 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
13f30 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
13f40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13f50 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
13f60 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
13f70 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
13f80 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
13f90 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
13fa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13fb0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
13fc0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
13fd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13fe0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
13ff0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
14000 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14010 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
14020 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61  p->db;.  rc = sa
14030 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
14040 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
14050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14060 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
14070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14080 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
14090 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
140a0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
140b0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
140c0 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
140d0 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
140e0 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
140f0 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
14100 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
14110 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
14120 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
14130 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
14140 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
14150 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
14160 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
14170 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
14180 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
14190 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
141a0 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
141b0 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
141c0 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
141d0 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
141e0 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
141f0 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
14200 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
14210 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
14220 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
14230 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
14240 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
14250 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
14260 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
14270 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
14280 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14290 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
142a0 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
142b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
142c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
142d0 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
142e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
142f0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
14300 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
14310 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
14320 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
14330 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
14340 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
14350 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
14360 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
14370 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
14380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14390 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
143a0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
143b0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
143c0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
143d0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
143e0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
143f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14400 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
14410 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
14420 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
14430 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
14440 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
14450 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14460 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
14470 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
14480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14490 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
144a0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
144b0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
144c0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
144d0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
144e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
144f0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
14500 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
14510 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
14520 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14530 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
14540 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
14550 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
14560 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
14570 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
14580 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14590 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
145a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
145b0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
145c0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
145d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
145e0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
145f0 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14600 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14610 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14620 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
14640 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
14650 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
14660 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
14670 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
14680 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
14690 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
146a0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
146b0 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
146c0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
146d0 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
146e0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
146f0 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
14700 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
14710 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
14720 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
14730 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
14740 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
14750 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
14760 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
14770 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
14780 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
14790 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
147a0 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
147b0 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
147c0 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
147d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
147e0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
147f0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
14800 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
14810 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
14820 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
14830 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
14840 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
14850 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
14860 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
14870 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
14880 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
14890 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
148a0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
148b0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
148c0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
148d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
148e0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
148f0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
14900 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14920 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
14930 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14940 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14950 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
14960 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14970 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14980 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ->db;.  if( (p->
14990 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
149a0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
149b0 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Stmt ){.    rc =
149c0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
149d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
149e0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
149f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14a00 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
14a10 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
14a20 57 52 49 54 45 20 29 3b 0a 20 20 20 20 69 66 28  WRITE );.    if(
14a30 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
14a40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
14a50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
14a60 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74  e{.      /* At t
14a70 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
14a80 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
14a90 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
14aa0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20  epoint with.    
14ab0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
14ac0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
14ad0 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
14ae0 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
14af0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 20  ng.      ** SQL 
14b00 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
14b10 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
14b20 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
14b30 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 20  llback any.     
14b40 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
14b50 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
14b60 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14b70 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14b80 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 2a   active..      *
14b90 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
14ba0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
14bb0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
14bc0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
14bd0 70 6f 69 6e 74 2b 31 29 3b 0a 20 20 20 20 7d 0a  point+1);.    }.
14be0 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
14bf0 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
14c00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14c20 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
14c30 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72  e statment subtr
14c40 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
14c50 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
14c60 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72    If no.** subtr
14c70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14c80 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ive, this is a n
14c90 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
14ca0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
14cb0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
14cc0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
14cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14ce0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
14cf0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
14d00 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
14d10 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
14d20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
14d30 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 74  y ){.    int iSt
14d40 6d 74 70 6f 69 6e 74 20 3d 20 70 2d 3e 64 62 2d  mtpoint = p->db-
14d50 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >nSavepoint;.   
14d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14d70 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
14d80 3e 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49  >pPager, SAVEPOI
14d90 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 74 6d  NT_RELEASE, iStm
14da0 74 70 6f 69 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  tpoint);.  }else
14db0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14dc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
14dd0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73  >inStmt = 0;.  s
14de0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14df0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
14e10 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
14e20 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
14e30 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
14e40 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
14e50 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
14e60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14e70 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
14e80 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
14e90 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
14ea0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
14eb0 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
14ec0 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
14ed0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
14ee0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14ef0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
14f00 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
14f10 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
14f20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
14f30 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
14f40 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
14f50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
14f60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14f70 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
14f80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14f90 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14fa0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
14fb0 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
14fc0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  Only ){.    int 
14fd0 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70 2d 3e  iStmtpoint = p->
14fe0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  db->nSavepoint;.
14ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15000 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
15010 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56 45  Bt->pPager, SAVE
15020 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
15030 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 20  iStmtpoint);.   
15040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
15060 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
15070 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
15080 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  er, SAVEPOINT_RE
15090 4c 45 41 53 45 2c 20 69 53 74 6d 74 70 6f 69 6e  LEASE, iStmtpoin
150a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  t);.    }.    pB
150b0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
150c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
150d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
150e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
150f0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
15100 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15110 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
15120 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
15130 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
15140 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
15150 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
15160 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
15170 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
15180 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
15190 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
151a0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
151b0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
151c0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
151d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
151e0 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
151f0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
15200 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
15210 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
15220 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
15230 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
15240 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
15250 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
15260 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
15270 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
15280 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
15290 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
152a0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
152b0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
152c0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
152d0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
152e0 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
152f0 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
15300 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
15310 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
15320 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
15330 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
15340 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
15350 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
15360 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15370 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
15380 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
15390 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
153a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
153b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
153c0 74 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  t->inStmt==0 );.
153d0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
153e0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
153f0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
15400 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
15410 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
15420 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
15430 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
15440 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
15450 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
15460 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15470 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  p);.    pBt->db 
15480 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 72 63 20  = p->db;.    rc 
15490 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
154a0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
154b0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
154c0 69 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  int);.    sqlite
154d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
154e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
154f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
15500 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
15510 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
15520 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
15530 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
15540 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71    The act of acq
15550 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20  uiring a cursor 
15560 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  gets a read lock
15570 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
15580 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
15590 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
155a0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
155b0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
155c0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
155d0 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
155e0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
155f0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
15600 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
15610 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
15620 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
15630 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
15640 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
15650 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
15660 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
15670 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
15680 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
15690 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
156a0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
156b0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
156c0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
156d0 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
156e0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
156f0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
15700 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
15710 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
15720 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
15730 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
15740 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
15750 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
15760 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
15770 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
15780 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
15790 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
157a0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
157b0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
157c0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
157d0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
157e0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
157f0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
15800 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
15810 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
15820 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
15830 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
15840 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
15850 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
15860 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
15870 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
15880 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
15890 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
158a0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
158b0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
158c0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
158d0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
158e0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
158f0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
15900 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
15910 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
15920 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
15930 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
15940 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
15950 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
15960 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  e() bytes of mem
15970 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20  ory .** pointed 
15980 74 6f 20 62 79 20 70 43 75 72 20 68 61 76 65 20  to by pCur have 
15990 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 74  been zeroed by t
159a0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
159b0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
159c0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
159d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159f0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
15a00 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
15a30 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
15a40 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
15a50 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
15a80 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
15a90 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
15aa0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
15ac0 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
15ad0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
15ae0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
15b10 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
15b20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
15b30 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20  .  Pgno nPage;. 
15b40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15b50 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
15b60 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
15b70 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
15b80 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
15b90 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
15ba0 31 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  1 );.  if( wrFla
15bb0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  g ){.    if( pBt
15bc0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
15bd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15be0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
15bf0 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
15c00 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
15c10 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  le, 0, 0) ){.   
15c20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15c30 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  _LOCKED;.    }. 
15c40 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
15c50 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
15c60 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
15c70 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
15c80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15c90 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
15ca0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15cb0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
15cc0 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20  y && wrFlag ){. 
15cd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15ce0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
15cf0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
15d00 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
15d10 69 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73  iTable;.  rc = s
15d20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
15d30 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
15d40 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29  , (int *)&nPage)
15d50 3b 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ; .  if( rc!=SQL
15d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15d70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
15d80 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
15d90 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
15da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
15db0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
15dc0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
15dd0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
15de0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
15df0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
15e00 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
15e10 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21  e[0]);.  if( rc!
15e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e30 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
15e40 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
15e50 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
15e60 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
15e70 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
15e80 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
15e90 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
15ea0 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e  * variables, lin
15eb0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
15ec0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
15ed0 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43  ist and set *ppC
15ee0 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74  ur (the.  ** out
15ef0 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  put argument to 
15f00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  this function)..
15f10 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65    */.  pCur->pKe
15f20 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
15f30 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
15f40 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
15f50 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
15f60 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72  >wrFlag = (u8)wr
15f70 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
15f80 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
15f90 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
15fa0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
15fb0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
15fc0 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
15fd0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
15fe0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
15ff0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
16000 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ID;..  return SQ
16010 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65  LITE_OK;..create
16020 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
16030 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  n:.  releasePage
16040 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  (pCur->apPage[0]
16050 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
16060 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
16070 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
16080 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
16090 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
160a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
160d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
160e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
16110 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
16120 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
16160 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
16170 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
16180 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
161b0 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
161c0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
161f0 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
16200 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
16210 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16220 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
16230 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
16240 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
16250 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
16260 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
16270 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
16280 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
162a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
162b0 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72 65  rsorSize(){.  re
162c0 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75  turn sizeof(BtCu
162d0 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  rsor);.}..../*.*
162e0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
162f0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
16300 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16310 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
16320 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
16330 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
16340 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
16350 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
16360 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
16370 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
16380 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
16390 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
163a0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
163b0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
163c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
163d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
163e0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
163f0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72    pBt->db = pBtr
16400 65 65 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69  ee->db;.    sqli
16410 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
16420 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
16430 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
16440 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
16450 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
16460 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
16470 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
16480 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
16490 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
164a0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
164b0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
164c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
164d0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
164e0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
164f0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
16500 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
16510 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
16520 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
16530 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
16540 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
16550 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
16560 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
16570 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
16580 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
16590 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
165a0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
165b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
165c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
165d0 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  ke a temporary c
165e0 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67  ursor by filling
165f0 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f   in the fields o
16600 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54  f pTempCur..** T
16610 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72  he temporary cur
16620 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  sor is not on th
16630 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f  e cursor list fo
16640 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a  r the Btree..*/.
16650 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
16660 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42  eGetTempCursor(B
16670 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42  tCursor *pCur, B
16680 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75  tCursor *pTempCu
16690 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
166a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
166b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
166c0 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43  .  memcpy(pTempC
166d0 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66  ur, pCur, sizeof
166e0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 70  (BtCursor));.  p
166f0 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  TempCur->pNext =
16700 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e   0;.  pTempCur->
16710 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72  pPrev = 0;.  for
16720 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75  (i=0; i<=pTempCu
16730 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
16740 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
16750 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61 70  Ref(pTempCur->ap
16760 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65  Page[i]->pDbPage
16770 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16780 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d   pTempCur->pKey=
16790 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  =0 );.}../*.** D
167a0 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72  elete a temporar
167b0 79 20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73  y cursor such as
167c0 20 77 61 73 20 6d 61 64 65 20 62 79 20 74 68 65   was made by the
167d0 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79   CreateTemporary
167e0 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63  Cursor().** func
167f0 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76  tion above..*/.v
16800 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
16810 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
16820 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
16830 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
16840 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
16850 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
16860 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
16870 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
16880 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16890 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61 70 50  rUnref(pCur->apP
168a0 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29  age[i]->pDbPage)
168b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
168c0 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
168d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
168e0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
168f0 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
16900 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
16910 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
16920 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
16930 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
16940 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
16950 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  ll.** sqlite3Btr
16960 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
16970 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
16980 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
16990 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
169a0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
169b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
169c0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
169d0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
169e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
169f0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
16a00 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
16a10 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
16a20 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
16a30 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
16a40 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
16a50 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
16a60 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
16a70 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
16a80 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
16a90 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
16aa0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
16ab0 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
16ac0 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
16ad0 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
16ae0 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
16af0 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
16b00 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
16b10 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
16b20 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
16b30 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
16b40 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
16b50 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
16b60 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
16b70 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
16b80 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
16b90 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
16ba0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
16bb0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
16bc0 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
16bd0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
16be0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
16bf0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
16c00 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
16c10 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
16c20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
16c30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
16c40 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
16c50 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
16c60 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
16c70 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
16c80 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
16c90 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
16ca0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
16cb0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
16cc0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
16cd0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
16ce0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
16cf0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
16d00 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
16d10 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
16d20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
16d30 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
16d40 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
16d50 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
16d60 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
16d70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
16d80 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
16d90 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
16da0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
16db0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
16dc0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
16dd0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
16de0 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
16df0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
16e00 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
16e10 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
16e20 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
16e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
16e40 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
16e50 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
16e60 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
16e70 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
16e80 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
16e90 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
16ea0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
16eb0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
16ec0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
16ed0 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
16f10 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
16f20 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16f60 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
16f70 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
16fc0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
16fd0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
16fe0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
16ff0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
17000 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
17010 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
170b0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170f0 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
17100 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
17110 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
17120 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
17130 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
17140 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
17150 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
17160 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
17170 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
17180 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
17190 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
171a0 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
171b0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
171c0 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
171d0 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
171e0 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
171f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
17200 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
17210 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
17220 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
17230 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
17240 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
17250 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
17260 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
17270 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
17280 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
17290 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
172a0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
172b0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
172c0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
172d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
172e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
172f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
17300 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
17310 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17320 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
17330 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17340 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
17350 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
17360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17370 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
17380 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
17390 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
173a0 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
173b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
173c0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
173d0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
173e0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
173f0 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
17400 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
17410 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
17420 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
17430 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
17440 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
17450 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
17460 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
17470 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
17480 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
17490 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
174a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
174b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
174c0 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
174d0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
174e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
174f0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
17500 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
17510 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
17520 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
17530 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17540 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
17550 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
17560 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
17570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17580 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
17590 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
175a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
175b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
175c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
175d0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
175e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
175f0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
17600 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
17610 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
17620 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
17630 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
17640 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
17650 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
17660 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
17670 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
17680 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
17690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
176a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
176b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
176c0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
176d0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
176e0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
176f0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
17700 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
17710 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
17720 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
17730 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
17740 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
17750 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
17760 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
17770 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
17780 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
17790 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
177a0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
177b0 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
177c0 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
177d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
177e0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
177f0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17800 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
17810 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e  *.** Unless pPgn
17820 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
17830 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
17840 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
17850 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20  low .** page in 
17860 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
17870 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
17880 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
17890 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65  e ovfl.** is the
178a0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
178b0 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a  s linked list, *
178c0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
178d0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
178e0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
178f0 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20  t NULL, *ppPage 
17900 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65  is set to the Me
17910 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a  mPage* handle.**
17920 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20   for page ovfl. 
17930 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70  The underlying p
17940 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61  ager page may ha
17950 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
17960 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f  d.** with the no
17970 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74  Content flag set
17980 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61  , so the page da
17990 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69  ta accessable vi
179a0 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65  a.** this handle
179b0 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
179c0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
179d0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
179e0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
179f0 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66  pBt, .  Pgno ovf
17a00 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
17a10 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77       /* Overflow
17a20 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
17a30 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
17a40 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
17a50 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a  MemPage handle *
17a60 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
17a70 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
17a80 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
17a90 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
17aa0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
17ab0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  next = 0;.  int 
17ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17ad0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17ae0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17af0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
17b00 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d  * One of these m
17b10 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
17b20 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79 20   Otherwise, why 
17b30 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
17b40 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on? */.  assert(
17b50 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e  ppPage || pPgnoN
17b60 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ext);..  /* If p
17b70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
17b80 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
17b90 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
17ba0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20  lled to obtain. 
17bb0 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72   ** a MemPage* r
17bc0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e  eference only. N
17bd0 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20 72  o page-data is r
17be0 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73 20  equired in this 
17bf0 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
17c00 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20   !pPgnoNext ){. 
17c10 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
17c20 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
17c30 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c  t, ovfl, ppPage,
17c40 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   1);.  }..#ifnde
17c50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17c60 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
17c70 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
17c80 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
17c90 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
17ca0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
17cb0 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
17cc0 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
17cd0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
17ce0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
17cf0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
17d00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
17d10 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
17d20 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
17d30 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
17d40 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
17d50 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
17d60 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
17d70 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
17d80 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
17d90 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
17da0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
17db0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
17dc0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
17dd0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
17de0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
17df0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
17e00 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17e10 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
17e20 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
17e30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
17e40 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
17e50 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
17e60 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
17e70 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
17e80 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
17e90 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
17ea0 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
17eb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17ee0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54    }.      if( eT
17ef0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17f00 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
17f10 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
17f20 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
17f30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17f40 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65  #endif..  if( ne
17f50 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20  xt==0 || ppPage 
17f60 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
17f70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  pPage = 0;..    
17f80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17f90 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
17fa0 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74  fl, &pPage, next
17fb0 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  !=0);.    assert
17fc0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
17fd0 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20  | pPage==0);.   
17fe0 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20   if( next==0 && 
17ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18000 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
18010 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
18020 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ata);.    }..   
18030 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
18040 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
18050 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Page;.    }else{
18060 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
18070 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
18080 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78  .  }.  *pPgnoNex
18090 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74  t = next;..  ret
180a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
180b0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
180c0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
180d0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
180e0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
180f0 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
18100 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
18110 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
18120 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
18130 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
18140 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
18150 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
18160 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
18170 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
18180 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
18190 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
181a0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
181b0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
181c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
181d0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
181e0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
181f0 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
18200 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
18210 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
18220 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
18230 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
18240 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
18250 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
18260 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
18270 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18280 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
18290 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
182a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
182b0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
182c0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
182d0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
182e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
182f0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
18300 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
18310 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18320 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
18330 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
18340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18350 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
18360 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
18370 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
18380 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
18390 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
183a0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
183b0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
183c0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
183d0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
183e0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
183f0 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
18400 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
18410 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18420 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
18430 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18440 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18450 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18460 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
18470 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
18480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
18490 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
184a0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
184b0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
184c0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
184d0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
184e0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
184f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18500 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18510 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
18520 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
18530 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
18540 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
18550 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
18560 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
18570 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74  ointing to. If t
18580 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65  he eOp.** parame
18590 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69  ter is 0, this i
185a0 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
185b0 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  on (data copied 
185c0 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  into.** buffer p
185d0 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e  Buf). If it is n
185e0 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65  on-zero, a write
185f0 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72   (data copied fr
18600 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  om.** buffer pBu
18610 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  f)..**.** A tota
18620 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
18630 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
18640 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
18650 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
18660 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
18670 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
18680 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
18690 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
186a0 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69  not make a disti
186b0 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b  nction between k
186c0 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20  ey and data..** 
186d0 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72  It just reads or
186e0 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72   writes bytes fr
186f0 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  om the payload a
18700 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74  rea.  Data might
18710 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74   .** appear on t
18720 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
18730 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
18740 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
18750 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e  rflow .** pages.
18760 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74  .**.** If the Bt
18770 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f  Cursor.isIncrblo
18780 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
18790 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  set, and the cur
187a0 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65  rent.** cursor e
187b0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
187c0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
187d0 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ages, this funct
187e0 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
187f0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
18800 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20  azily popluates 
18810 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
18820 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65  e-list .** cache
18830 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
18840 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62  .aOverflow). Sub
18850 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
18860 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20  e this.** cache 
18870 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
18880 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
18890 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69  offset more effi
188a0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
188b0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
188c0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
188d0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
188e0 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
188f0 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
18900 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
18910 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
18920 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
18930 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
18940 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
18950 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
18960 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
18970 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
18980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
18990 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
189a0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
189b0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
189c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
189d0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
189e0 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
189f0 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
18a00 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
18a10 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
18a20 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
18a30 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
18a40 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
18a50 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
18a60 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
18a70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
18a80 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
18a90 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
18aa0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
18ab0 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
18ac0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
18ad0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
18ae0 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
18af0 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
18b00 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
18b10 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
18b20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18b30 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
18b40 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
18b50 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
18b60 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20    int skipKey,  
18b70 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
18b80 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
18b90 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
18ba0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  */.  int eOp    
18bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
18bc0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
18bd0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
18be0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
18bf0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
18c00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18c10 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
18c20 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
18c30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
18c40 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
18c50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
18c60 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
18c70 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
18c80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18c90 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18cb0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
18cc0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
18cd0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
18ce0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
18cf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18d00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
18d10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
18d20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
18d30 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
18d40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
18d50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
18d60 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
18d70 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
18d80 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
18d90 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
18da0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
18db0 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
18dc0 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e  intKey ? 0 : (in
18dd0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
18de0 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
18df0 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
18e00 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
18e10 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
18e20 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
18e30 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61  .nData .   || &a
18e40 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
18e50 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50  fo.nLocal] > &pP
18e60 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
18e70 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b  usableSize].  ){
18e80 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
18e90 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
18ea0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
18eb0 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
18ec0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
18ed0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18ee0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
18ef0 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
18f00 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
18f10 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
18f20 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
18f30 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
18f40 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
18f50 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
18f60 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
18f70 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
18f80 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
18f90 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
18fa0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
18fb0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
18fc0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18fd0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
18fe0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
18ff0 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
19000 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
19010 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
19020 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
19030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
19040 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
19050 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
19060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19070 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
19080 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
19090 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
190a0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
190b0 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
190c0 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
190d0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
190e0 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
190f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
19100 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
19110 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
19120 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19130 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
19140 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
19150 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
19160 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
19170 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
19180 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
19190 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
191a0 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
191b0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
191c0 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
191d0 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
191e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
191f0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
19200 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
19210 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
19220 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
19230 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
19240 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
19250 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
19260 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
19270 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
19280 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
19290 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
192a0 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
192b0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
192c0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
192d0 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
192e0 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
192f0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
19300 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
19310 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
19320 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
19330 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
19340 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
19350 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
19360 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
19370 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
19380 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
19390 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vfl);.      if( 
193a0 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e  nOvfl && !pCur->
193b0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
193c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
193d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
193e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
193f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
19400 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
19410 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
19420 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
19430 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
19440 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
19450 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
19460 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
19470 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
19480 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19490 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
194a0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
194b0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
194c0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
194d0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
194e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
194f0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
19500 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
19510 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
19520 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
19530 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
19540 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
19550 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
19560 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
19570 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
19580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
19590 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
195a0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
195b0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
195c0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
195d0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
195e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
195f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19600 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
19610 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
19620 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
19630 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
19640 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
19650 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
19660 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
19670 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
19680 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
19690 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
196a0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
196b0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
196c0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
196d0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
196e0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
196f0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
19700 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
19710 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
19720 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
19730 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
19740 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
19750 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
19760 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
19770 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
19780 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
19790 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
197a0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
197b0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
197c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
197d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
197e0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
197f0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
19800 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
19810 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
19820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
19830 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
19840 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
19850 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
19860 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
19870 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
19880 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
19890 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
198a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
198b0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
198c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
198d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
198e0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
198f0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
19900 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
19910 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
19920 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
19930 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
19940 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
19950 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
19960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19970 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
19980 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
19990 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
199a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
199b0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
199c0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
199d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
199e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
199f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
19a00 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
19a10 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
19a20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
19a30 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
19a40 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
19a50 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
19a60 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
19a70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
19a80 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
19a90 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
19aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
19ab0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
19ac0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
19ad0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
19ae0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
19af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19b00 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
19b10 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
19b20 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
19b30 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
19b40 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
19b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19b60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
19b70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19b80 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
19b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ba0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19bb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19bc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
19bd0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
19be0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
19bf0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
19c00 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
19c10 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
19c20 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
19c30 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
19c40 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
19c50 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
19c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
19c70 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
19c80 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
19c90 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
19ca0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
19cb0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
19cc0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
19cd0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
19ce0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
19cf0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
19d00 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
19d10 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
19d20 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
19d30 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
19d40 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19d50 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19d60 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
19d70 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
19d80 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
19d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19db0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19dc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
19dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
19de0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
19df0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
19e00 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
19e10 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  if( pCur->apPage
19e20 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
19e30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19e40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19e50 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19e60 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
19e70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
19e80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
19e90 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
19ea0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
19eb0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
19ec0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
19ed0 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
19ee0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
19ef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19f00 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
19f10 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
19f20 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
19f30 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
19f40 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
19f50 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
19f60 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
19f70 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
19f80 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
19f90 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
19fa0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
19fb0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
19fc0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
19fd0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
19fe0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
19ff0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1a000 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1a010 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1a020 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1a030 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a040 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
1a050 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1a060 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1a070 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
1a080 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1a090 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1a0a0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
1a0b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1a0c0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1a0d0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
1a0e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1a0f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a100 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a110 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1a120 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1a130 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1a140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a170 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
1a180 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1a190 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1a1a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1a1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a1c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1a1d0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1a1e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1a1f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
1a200 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
1a210 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1a220 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a  t, pBuf, 1, 0);.
1a230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a250 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1a260 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1a270 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
1a280 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
1a290 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1a2a0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
1a2b0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
1a2c0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
1a2d0 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
1a2e0 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
1a2f0 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
1a300 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
1a310 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
1a320 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
1a330 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
1a340 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
1a350 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
1a360 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
1a370 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
1a380 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
1a390 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
1a3a0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
1a3b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a3c0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
1a3d0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
1a3e0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
1a3f0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
1a400 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
1a410 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
1a420 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
1a430 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
1a440 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
1a450 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
1a460 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1a470 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
1a480 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
1a490 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
1a4a0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
1a4b0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
1a4c0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
1a4d0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
1a4e0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
1a4f0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
1a500 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
1a510 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
1a520 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
1a530 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
1a540 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
1a550 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
1a560 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
1a570 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
1a580 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
1a590 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1a5a0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
1a5b0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
1a5c0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
1a5d0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
1a5e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1a5f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a600 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a610 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
1a620 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a630 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1a640 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1a650 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1a660 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
1a670 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1a680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1a690 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
1a6a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
1a6b0 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
1a6c0 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
1a6d0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1a6e0 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
1a6f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1a700 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
1a710 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
1a720 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f   nKey;.  u32 nLo
1a730 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
1a740 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
1a750 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1a760 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1a770 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
1a780 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1a790 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1a7a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a7b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a7c0 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ) );.  pPage = p
1a7d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1a7e0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
1a7f0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1a800 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1a810 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67  ge->nCell );.  g
1a820 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1a830 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1a840 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b  Cur->info.pCell;
1a850 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70  .  aPayload += p
1a860 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1a870 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  r;.  if( pPage->
1a880 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b  intKey ){.    nK
1a890 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
1a8a0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74  .    nKey = (int
1a8b0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
1a8c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
1a8d0 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
1a8e0 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
1a8f0 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
1a900 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
1a910 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
1a920 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
1a930 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
1a940 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79   if( nLocal>nKey
1a950 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c   ){.      nLocal
1a960 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20   = nKey;.    }. 
1a970 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
1a980 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
1a990 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
1a9a0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
1a9b0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
1a9c0 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
1a9d0 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
1a9e0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
1a9f0 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
1aa00 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
1aa10 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
1aa20 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
1aa30 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1aa40 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
1aa50 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
1aa60 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
1aa70 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
1aa80 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
1aa90 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
1aaa0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
1aab0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
1aac0 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
1aad0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
1aae0 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
1aaf0 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
1ab00 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
1ab10 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
1ab20 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
1ab30 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
1ab40 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1ab50 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
1ab60 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
1ab70 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
1ab80 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
1ab90 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
1aba0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
1abb0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
1abc0 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
1abd0 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
1abe0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
1abf0 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
1ac00 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ac10 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1ac20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ac30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1ac40 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1ac50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ac60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1ac70 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1ac80 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1ac90 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
1aca0 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74  eturn 0;.}.const
1acb0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1acc0 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
1acd0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1ace0 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1acf0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ad00 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1ad10 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ad20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1ad30 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1ad40 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1ad50 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1ad60 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
1ad70 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
1ad80 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1ad90 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
1ada0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
1adb0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
1adc0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
1add0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
1ade0 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
1adf0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
1ae00 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
1ae10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1ae20 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
1ae30 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
1ae40 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
1ae50 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
1ae60 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1ae70 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
1ae80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ae90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1aea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1aeb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1aec0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1aed0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1aee0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
1aef0 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
1af00 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
1af10 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
1af20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1af30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1af40 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
1af50 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1af60 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
1af70 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
1af80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1af90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
1afa0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
1afb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
1afc0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
1afd0 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
1afe0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1aff0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1b000 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
1b010 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
1b020 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b030 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b040 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1b050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1b060 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1b070 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
1b080 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
1b090 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
1b0a0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1b0b0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
1b0c0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1b0d0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
1b0e0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
1b0f0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
1b100 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
1b110 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
1b120 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
1b130 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
1b140 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
1b150 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
1b160 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1b170 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
1b180 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
1b190 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1b1a0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
1b1b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
1b1c0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
1b1d0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
1b1e0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
1b1f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
1b200 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
1b210 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
1b220 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
1b230 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
1b240 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
1b250 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
1b260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1b270 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
1b280 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
1b290 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
1b2a0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
1b2b0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
1b2c0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
1b2d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1b2e0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1b2f0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1b300 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1b310 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1b320 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1b330 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1b340 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1b350 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1b360 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1b370 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1b380 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1b390 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1b3a0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1b3b0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1b3c0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1b3d0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1b3e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b3f0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1b400 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1b410 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
1b420 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b430 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b440 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b450 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1b460 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b470 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
1b480 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1b490 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1b4a0 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
1b4b0 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
1b4c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1b4d0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1b4e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1b4f0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
1b500 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b510 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
1b520 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1b530 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
1b540 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
1b550 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
1b560 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b570 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1b580 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
1b590 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1b5a0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1b5b0 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1b5c0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1b5d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b5e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1b5f0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1b600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
1b610 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
1b620 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
1b630 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1b640 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b650 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1b670 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
1b680 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1b690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1b6a0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
1b6b0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1b6c0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1b6d0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
1b6e0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1b6f0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
1b700 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
1b710 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
1b720 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1b730 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
1b740 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
1b750 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
1b760 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b770 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1b780 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
1b790 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
1b7a0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
1b7b0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
1b7c0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1b7d0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1b7e0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1b7f0 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e[i]);.    }.  }
1b800 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
1b810 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
1b820 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
1b830 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
1b840 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
1b850 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20  >apPage[0])).   
1b860 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1b870 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1b880 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1b890 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b8a0 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70    }..  pRoot = p
1b8b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
1b8c0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1b8d0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1b8e0 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d  oRoot );.  pCur-
1b8f0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43  >iPage = 0;.  pC
1b900 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
1b910 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1b920 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1b930 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1b940 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1b950 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
1b960 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
1b970 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
1b980 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
1b990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1b9a0 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  ot->pgno==1 );. 
1b9b0 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
1b9c0 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
1b9d0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
1b9e0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
1b9f0 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20  sert( subpage>0 
1ba00 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
1ba10 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
1ba20 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
1ba30 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
1ba40 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
1ba50 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
1ba60 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
1ba70 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
1ba80 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
1ba90 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
1baa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1bab0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1bac0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
1bad0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1bae0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
1baf0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
1bb00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1bb10 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
1bb20 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1bb30 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1bb40 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
1bb50 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
1bb60 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1bb70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1bb80 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
1bb90 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1bba0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1bbb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bbc0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1bbd0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1bbe0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1bbf0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1bc00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1bc10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1bc20 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1bc30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1bc40 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
1bc50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1bc60 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
1bc70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1bc80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1bc90 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1bca0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
1bcb0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1bcc0 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
1bcd0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
1bce0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1bcf0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1bd00 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
1bd10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1bd20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1bd30 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
1bd40 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1bd50 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
1bd60 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
1bd70 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1bd80 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
1bd90 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
1bda0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
1bdb0 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
1bdc0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
1bdd0 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
1bde0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
1bdf0 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
1be00 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
1be10 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
1be20 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
1be30 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
1be40 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1be50 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
1be60 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
1be70 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
1be80 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
1be90 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
1bea0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
1beb0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1bec0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1bed0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
1bee0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1bef0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1bf00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bf10 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
1bf20 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
1bf30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1bf40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1bf50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1bf60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1bf70 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1bf80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bf90 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1bfa0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1bfb0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
1bfc0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1bfd0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1bfe0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1bff0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
1c000 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1c010 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
1c020 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
1c030 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1c040 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
1c050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c060 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1c070 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
1c080 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1c090 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1c0a0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1c0b0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1c0c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c0d0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1c0e0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1c0f0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1c100 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1c110 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1c120 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1c130 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1c140 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1c150 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1c160 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1c170 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1c180 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1c190 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c1a0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
1c1b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1c1c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1c1d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1c1e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c1f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1c200 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c210 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1c220 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1c230 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1c240 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c260 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1c270 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1c280 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
1c290 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1c2a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1c2b0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1c2c0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1c2d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c2e0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1c2f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1c300 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1c310 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
1c320 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1c330 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1c340 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1c350 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1c360 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c370 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1c380 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1c390 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1c3a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1c3b0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1c3c0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1c3d0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1c3e0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1c3f0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1c400 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1c410 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1c420 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1c430 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
1c440 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c450 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1c460 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
1c470 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c480 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1c490 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c4a0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1c4b0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1c4c0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1c4d0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1c4e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c4f0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
1c500 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1c510 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1c520 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1c530 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1c540 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1c550 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1c560 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1c570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1c580 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c590 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
1c5a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1c5b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1c5c0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1c5d0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1c5e0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
1c5f0 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
1c600 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
1c610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1c630 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
1c640 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1c650 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
1c660 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
1c670 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
1c680 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
1c690 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
1c6a0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
1c6b0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
1c6c0 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
1c6d0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
1c6e0 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
1c6f0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
1c700 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
1c710 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
1c720 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
1c730 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1c740 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1c750 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1c760 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1c770 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1c780 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1c790 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1c7a0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1c7b0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1c7c0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1c7d0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1c7e0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1c7f0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1c800 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1c810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1c820 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
1c830 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1c840 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1c850 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
1c860 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
1c870 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20   if pRes!=NULL. 
1c880 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a   The meaning of.
1c890 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  ** this value is
1c8a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1c8b0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
1c8c0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1c8d0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1c8e0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1c8f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1c900 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
1c910 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20  than pKey or if 
1c920 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1c930 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
1c940 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
1c950 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
1c960 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
1c970 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
1c980 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
1c990 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1c9a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1c9b0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
1c9e0 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  s pKey..**.**   
1c9f0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1ca00 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1ca10 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1ca20 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
1ca50 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
1ca60 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1ca70 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
1ca80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1ca90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1caa0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
1cab0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1cac0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
1cad0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
1cae0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
1caf0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1cb00 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
1cb10 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
1cb20 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1cb30 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
1cb40 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
1cb50 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1cb60 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1cb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1cb80 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
1cb90 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1cba0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1cbb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1cbc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1cbd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1cbe0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1cbf0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1cc00 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
1cc10 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
1cc20 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
1cc30 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
1cc40 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
1cc50 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
1cc60 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
1cc70 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
1cc80 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
1cc90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1cca0 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
1ccb0 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
1ccc0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
1ccd0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
1cce0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1ccf0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
1cd00 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
1cd10 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1cd20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cd30 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1cd40 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
1cd50 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
1cd60 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
1cd70 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1cd80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1cd90 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
1cda0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1cdb0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1cdc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1cdd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1cde0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1cdf0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1ce00 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1ce10 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
1ce20 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nit );.  if( pCu
1ce30 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1ce40 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1ce50 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1ce60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1ce70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ce80 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
1ce90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cea0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1ceb0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1cec0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
1ced0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
1cee0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
1cef0 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
1cf00 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
1cf10 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1cf20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1cf30 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
1cf40 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73  c = -1;  /* pRes
1cf50 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65   return if table
1cf60 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62   is empty must b
1cf70 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20  e -1 */.    lwr 
1cf80 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
1cf90 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1cfa0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
1cfb0 6e 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79  ntKey && pIdxKey
1cfc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1cfd0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1cfe0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1cff0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1d000 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1d010 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1d020 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1d030 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1d040 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
1d050 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
1d060 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1d070 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
1d080 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
1d090 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20   if( lwr<=upr ) 
1d0a0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76  for(;;){.      v
1d0b0 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
1d0c0 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
1d0d0 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  y;.      int idx
1d0e0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
1d0f0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1d100 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1d110 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
1d120 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1d130 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   1;.      if( pP
1d140 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1d150 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c         u8 *pCell
1d160 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
1d170 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1d180 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
1d190 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
1d1a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1d1b0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
1d1c0 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b        u32 dummy;
1d1d0 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1d1e0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1d1f0 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20  pCell, dummy);. 
1d200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d210 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
1d220 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
1d230 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
1d240 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
1d250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1d260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1d270 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
1d280 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1d290 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
1d2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d2b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
1d2c0 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a  llKey>intKey );.
1d2d0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
1d2e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d300 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a   int available;.
1d310 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1d320 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68   = (void *)fetch
1d330 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61  Payload(pCur, &a
1d340 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20  vailable, 0);.  
1d350 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d        nCellKey =
1d360 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1d370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76  ;.        if( av
1d380 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65  ailable>=nCellKe
1d390 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1d3a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1d3b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69 6e 74  cordCompare((int
1d3c0 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  )nCellKey, pCell
1d3d0 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
1d3e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d3f0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
1d400 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1d410 28 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 20  ( (int)nCellKey 
1d420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d430 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
1d440 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d450 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d460 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1d470 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1d480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d4a0 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
1d4b0 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
1d4c0 2c 20 28 76 6f 69 64 2a 29 70 43 65 6c 6c 4b 65  , (void*)pCellKe
1d4d0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  y);.          c 
1d4e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1d4f0 6f 72 64 43 6f 6d 70 61 72 65 28 28 69 6e 74 29  ordCompare((int)
1d500 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1d510 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
1d520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1d530 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
1d540 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d550 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1d560 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
1d570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d580 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1d590 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1d5a0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1d5b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1d5c0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
1d5d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d5e0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
1d5f0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
1d600 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20   lwr - 1;.      
1d610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d630 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1d640 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1d650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d660 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1d670 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1d680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d690 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1d6a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1d6b0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
1d6c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
1d6d0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
1d6e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77    }.      if( lw
1d6f0 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20  r>upr ){.       
1d700 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1d710 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
1d720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d730 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
1d740 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1d750 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b  e] = (u16)((lwr+
1d760 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
1d770 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
1d780 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
1d790 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1d7a0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
1d7b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1d7c0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
1d7d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
1d7e0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1d7f0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1d800 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1d810 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1d820 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1d830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1d840 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1d850 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1d860 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
1d870 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
1d880 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1d890 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1d8a0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1d8b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1d8c0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1d8d0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1d8e0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
1d8f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d900 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1d910 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1d920 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1d930 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1d940 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75  u16)lwr;.    pCu
1d950 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1d960 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1d970 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
1d980 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1d990 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1d9a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1d9b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1d9c0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
1d9d0 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
1d9e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
1d9f0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
1da00 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
1da10 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
1da20 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
1da30 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
1da40 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1da50 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
1da60 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
1da70 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
1da80 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
1da90 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
1daa0 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   work..*/.int sq
1dab0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1dac0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1dad0 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
1dae0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
1daf0 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
1db00 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
1db10 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
1db20 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
1db30 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
1db40 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
1db50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1db60 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
1db70 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
1db80 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
1db90 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
1dba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
1dbb0 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
1dbc0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1dbd0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1dbe0 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
1dbf0 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
1dc00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
1dc30 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1dc40 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
1dc50 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1dc60 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ex key */.  Unpa
1dc70 63 6b 65 64 52 65 63 6f 72 64 20 61 53 70 61 63  ckedRecord aSpac
1dc80 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d 70 20 73  e[16]; /* Temp s
1dc90 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
1dca0 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
1dcb0 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70  lloc */..  if( p
1dcc0 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
1dcd0 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
1dce0 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
1dcf0 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
1dd00 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1dd10 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
1dd20 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
1dd30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20          aSpace, 
1dd60 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b  sizeof(aSpace));
1dd70 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
1dd80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1dd90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
1dda0 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
1ddb0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
1ddc0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1ddd0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
1dde0 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
1ddf0 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
1de00 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73  f( pKey ){.    s
1de10 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
1de20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70  UnpackedRecord(p
1de30 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72  IdxKey);.  }.  r
1de40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1de50 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1de60 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1de70 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1de80 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1de90 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1dea0 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1deb0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1dec0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1ded0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1dee0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1def0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1df00 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1df10 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1df20 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1df30 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1df40 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1df50 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1df60 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1df70 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1df80 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1df90 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1dfa0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1dfb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1dfc0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1dfd0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1dfe0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1dff0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1e000 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1e010 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1e020 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1e030 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1e040 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1e050 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1e060 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1e070 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1e080 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e090 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1e0a0 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ion handle for a
1e0b0 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69   cursor..*/.sqli
1e0c0 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65  te3 *sqlite3Btre
1e0d0 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20  eCursorDb(const 
1e0e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1e0f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e100 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1e110 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1e120 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
1e130 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  rn pCur->pBtree-
1e140 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  >db;.}../*.** Ad
1e150 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1e160 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
1e170 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1e180 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1e190 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1e1a0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1e1b0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1e1c0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1e1d0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1e1e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e1f0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1e200 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1e210 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1e220 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1e230 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
1e240 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1e250 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1e260 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
1e270 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1e280 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1e290 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e2a0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1e2b0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1e2c0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1e2d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e2e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1e2f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
1e300 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
1e310 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1e320 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1e330 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1e340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e350 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1e360 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
1e370 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1e380 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1e390 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e3a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1e3b0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1e3c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e3d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e3e0 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
1e3f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1e400 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1e410 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1e420 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
1e430 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
1e440 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
1e450 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1e460 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1e470 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
1e480 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1e490 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1e4a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
1e4b0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1e4c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1e4d0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1e4e0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
1e4f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1e500 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
1e510 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1e520 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1e530 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1e540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e550 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
1e560 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
1e570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
1e580 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1e590 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1e5a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1e5b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1e5c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1e5d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1e5e0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1e5f0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1e600 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1e610 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1e620 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
1e630 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1e640 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
1e650 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
1e660 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1e670 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1e680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e690 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
1e6a0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1e6b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1e6c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e6d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e6e0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1e6f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1e700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1e710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1e720 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1e730 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1e740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1e750 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
1e760 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
1e770 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
1e780 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1e790 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1e7a0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1e7b0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1e7c0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1e7d0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1e7e0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1e7f0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1e800 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
1e810 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
1e820 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
1e830 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
1e840 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1e850 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
1e860 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1e870 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1e880 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1e890 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1e8a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1e8b0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1e8c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1e8d0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1e8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e8f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1e900 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
1e910 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
1e920 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1e930 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1e940 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1e950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e960 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1e970 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
1e980 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1e990 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1e9a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e9b0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1e9c0 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
1e9d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e9e0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1e9f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1ea00 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
1ea10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1ea20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
1ea30 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ea40 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
1ea50 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1ea60 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1ea70 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
1ea80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1ea90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1eaa0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1eab0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1eac0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1ead0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
1eae0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1eaf0 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
1eb00 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
1eb10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
1eb20 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1eb30 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1eb40 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1eb50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1eb60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1eb70 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1eb80 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1eb90 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1eba0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1ebb0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1ebc0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1ebd0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
1ebe0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
1ebf0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
1ec00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ec10 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
1ec20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
1ec30 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1ec40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1ec50 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1ec60 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
1ec70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ec90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
1eca0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
1ecb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1ecc0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1ecd0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ece0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
1ecf0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
1ed00 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
1ed10 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1ed20 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
1ed30 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
1ed40 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1ed50 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1ed60 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
1ed70 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
1ed80 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
1ed90 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1eda0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
1edb0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
1edc0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1edd0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
1ede0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
1edf0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
1ee00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1ee10 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
1ee20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
1ee30 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1ee40 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
1ee50 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
1ee60 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
1ee70 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1ee80 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
1ee90 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
1eea0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1eeb0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
1eec0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1eed0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1eee0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
1eef0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
1ef00 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
1ef10 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1ef20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
1ef30 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
1ef40 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
1ef50 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
1ef60 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
1ef70 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
1ef80 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
1ef90 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
1efa0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
1efb0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
1efc0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
1efd0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
1efe0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
1eff0 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
1f000 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1f010 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
1f020 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
1f030 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
1f040 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1f050 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
1f060 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
1f070 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
1f080 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
1f090 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1f0a0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
1f0b0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
1f0c0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1f0d0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1f0e0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1f0f0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1f100 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1f110 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1f120 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1f130 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1f140 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1f150 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1f160 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f170 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1f180 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1f190 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1f1a0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1f1b0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1f1c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
1f1d0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
1f1e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
1f1f0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
1f200 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f210 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1f220 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
1f230 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1f240 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1f250 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1f260 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1f270 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1f280 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1f290 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1f2a0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1f2b0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1f2c0 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1f2d0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1f2e0 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1f2f0 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1f300 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1f310 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1f320 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1f330 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1f340 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1f350 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1f360 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1f370 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1f380 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1f390 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1f3a0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1f3b0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1f3c0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1f3d0 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1f3e0 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1f3f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f400 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f410 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
1f420 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
1f430 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 75 38  pBt) ){.      u8
1f440 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
1f450 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
1f460 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f470 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f480 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
1f490 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
1f4a0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
1f4b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1f4c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f4d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1f4e0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1f4f0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1f500 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
1f510 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
1f520 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
1f530 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
1f540 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
1f550 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
1f560 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
1f570 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
1f580 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
1f590 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
1f5a0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
1f5b0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
1f5c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1f5d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1f5e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f5f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f600 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
1f610 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1f620 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
1f630 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
1f640 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
1f650 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
1f660 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
1f670 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
1f680 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
1f690 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
1f6a0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
1f6b0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
1f6c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
1f6d0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
1f6e0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
1f6f0 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
1f700 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
1f710 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
1f720 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
1f730 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1f740 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1f750 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
1f760 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
1f770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f780 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
1f790 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f7a0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
1f7b0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1f7c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f7d0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
1f7e0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
1f7f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f800 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1f810 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1f820 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f830 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f840 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1f850 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
1f860 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
1f870 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
1f880 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1f890 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
1f8a0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
1f8b0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
1f8c0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
1f8d0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
1f8e0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
1f8f0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
1f900 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
1f910 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
1f920 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
1f930 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
1f940 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
1f950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f960 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1f970 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1f980 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1f990 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1f9a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1f9b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f9c0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
1f9d0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
1f9e0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1f9f0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1fa00 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1fa10 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1fa20 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1fa30 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1fa40 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1fa50 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1fa60 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1fa70 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1fa80 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
1fa90 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75  lse if( k>pBt->u
1faa0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
1fab0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
1fac0 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
1fad0 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
1fae0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
1faf0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
1fb00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fb10 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
1fb20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1fb30 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
1fb40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1fb50 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
1fb60 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26  f( searchList &&
1fb70 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20   nearby==iTrunk 
1fb80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1fb90 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
1fba0 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
1fbb0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
1fbc0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
1fbd0 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
1fbe0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
1fbf0 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
1fc00 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
1fc10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fc20 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20   *pPgno==iTrunk 
1fc30 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
1fc40 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
1fc50 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1fc60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
1fc70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1fc80 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1fc90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1fca0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1fcb0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1fcc0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1fcd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1fce0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1fcf0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1fd00 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1fd10 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1fd20 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1fd30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1fd40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1fd50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1fd60 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
1fd70 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1fd80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1fd90 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1fda0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fdc0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
1fdd0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
1fde0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
1fdf0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
1fe00 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
1fe10 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
1fe20 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
1fe30 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
1fe40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
1fe50 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1fe60 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1fe70 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1fe80 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
1fe90 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
1fea0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1feb0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
1fec0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
1fed0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1fee0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
1fef0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
1ff00 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
1ff10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ff20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ff30 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1ff40 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1ff50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ff60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ff70 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
1ff80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1ff90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ffa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ffb0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1ffc0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1ffe0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1fff0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
20000 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
20010 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
20020 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
20030 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
20040 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
20050 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
20060 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
20070 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
20080 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
20090 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
200a0 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
200b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
200c0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
200d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
200e0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
200f0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
20100 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
20110 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
20120 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
20130 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
20140 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20150 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
20160 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
20170 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20190 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
201a0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
201b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
201c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
201d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
201e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
201f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20200 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20210 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
20220 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
20230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
20250 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
20260 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
20270 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
20280 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
20290 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
202a0 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
202b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
202c0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
202d0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
202e0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  nk */.        in
202f0 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  t closest;.     
20300 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
20310 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
20320 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
20330 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
20340 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20350 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
20360 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
20370 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
20380 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
20390 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
203a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
203b0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
203c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
203d0 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20  t i, dist;.     
203e0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
203f0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
20400 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
20410 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
20420 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
20430 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
20440 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
20450 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
20460 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
20470 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
20480 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
20490 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
204a0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
204b0 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
204c0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
204d0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
204e0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
204f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20500 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
20510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
20530 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
20540 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
20550 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
20560 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
20570 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
20580 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
20590 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
205a0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
205b0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
205c0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  nPage;.         
205d0 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
205e0 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67 65  .          nPage
205f0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
20600 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  t(pBt);.        
20610 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61    if( *pPgno>nPa
20620 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
20630 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
20640 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
20650 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
20660 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20670 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20680 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
20690 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
206a0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
206b0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
206c0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
206d0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
206e0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20700 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
20710 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
20720 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
20730 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
20740 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
20750 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
20760 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
20770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
20780 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
20790 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
207a0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
207b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
207c0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
207d0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
207e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
207f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
20800 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70  teable(pTrunk->p
20810 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
20820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20830 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
20840 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
20850 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 1);.         
20860 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
20880 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
20890 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50  ntRollback((*ppP
208a0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
208b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
208c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
208d0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
208e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
208f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20910 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20920 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
20930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20950 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
20960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20970 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
20980 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
20990 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
209a0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
209b0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
209c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
209d0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
209e0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
209f0 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
20a00 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
20a10 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
20a20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
20a30 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65  int nPage = page
20a40 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
20a50 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50  .    *pPgno = nP
20a60 61 67 65 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65  age + 1;..#ifnde
20a70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20a80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
20a90 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a   pBt->nTrunc ){.
20aa0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72        /* An incr
20ab0 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65  -vacuum has alre
20ac0 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74  ady run within t
20ad0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
20ae0 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   So the.      **
20af0 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74   page to allocat
20b00 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68  e is not from th
20b10 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f  e physical end o
20b20 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a  f the file, but.
20b30 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d        ** at pBt-
20b40 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20  >nTrunc. .      
20b50 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  */.      *pPgno 
20b60 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b  = pBt->nTrunc+1;
20b70 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
20b80 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
20b90 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20ba0 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
20bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20bc0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
20bd0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
20be0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50  _ISPAGE(pBt, *pP
20bf0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  gno) ){.      /*
20c00 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
20c10 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
20c20 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
20c30 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
20c40 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
20c50 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
20c60 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
20c70 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
20c80 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
20c90 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
20ca0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
20cb0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
20cc0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
20cd0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
20ce0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
20cf0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
20d00 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
20d10 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
20d20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  *pPgno));.      
20d30 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
20d40 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20d50 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
20d60 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
20d70 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
20d80 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
20d90 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
20da0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20  ++; }.    }.    
20db0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
20dc0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
20dd0 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20  runc = *pPgno;. 
20de0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20df0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
20e00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
20e10 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
20e20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20e30 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
20e40 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
20e50 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20e60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
20e70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20e80 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
20e90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
20ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20eb0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
20ec0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
20ed0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
20ee0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
20ef0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
20f00 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
20f10 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
20f20 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
20f30 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
20f40 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
20f50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
20f60 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
20f70 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
20f80 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
20fa0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
20fb0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
20fc0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
20fd0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
20fe0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
20ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21000 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
21020 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
21030 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
21050 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64   a page of the d
21060 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
21070 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
21080 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
21090 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63  Unref() is NOT c
210a0 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e  alled for pPage.
210b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
210c0 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
210d0 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  *pPage){.  BtSha
210e0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
210f0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
21100 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
21110 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
21120 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72  , n, k;..  /* Pr
21130 65 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66  epare the page f
21140 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20  or freeing */.  
21150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21160 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
21170 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
21180 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21190 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50  ->pgno>1 );.  pP
211a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
211b0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
211c0 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
211d0 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
211e0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
211f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
21200 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
21210 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21220 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  c;.  n = get4byt
21230 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
21240 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
21250 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
21260 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66  [36], n+1);..#if
21270 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
21280 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
21290 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
212a0 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
212b0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
212c0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
212d0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
212e0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
212f0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
21300 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
21310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21320 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
21330 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
21340 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
21350 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
21360 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
21370 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
21380 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
21390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
213a0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
213b0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
213c0 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
213d0 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
213e0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
213f0 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
21400 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
21410 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20  ACUUM ){.    rc 
21420 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
21430 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54   pPage->pgno, PT
21440 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
21450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
21460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
21470 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
21480 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
21490 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
214a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
214b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
214c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
214d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
214e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
214f0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
21500 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
21510 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
21520 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
21530 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
21540 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
21550 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
21560 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
21570 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
21580 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
21590 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
215a0 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
215b0 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
215c0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
215d0 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
215e0 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
215f0 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
21600 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
21610 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21620 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65  eGetPage(pBt, ge
21630 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
21640 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72  aData[32]), &pTr
21650 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
21660 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21670 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
21680 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
21690 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
216a0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
216b0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
216c0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
216d0 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
216e0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
216f0 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
21700 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
21710 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a  with no leaves..
21720 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21730 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
21740 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
21750 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
21760 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
21770 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
21780 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
21790 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
217a0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
217b0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
217c0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
217d0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
217e0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
217f0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
21800 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
21810 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
21820 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
21830 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
21840 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
21850 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
21860 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
21870 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
21880 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
21890 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
218a0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
218b0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
218c0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
218d0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
218e0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
218f0 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74   contain to rest
21900 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
21910 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
21920 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
21930 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
21940 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
21950 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
21960 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
21970 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
21980 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
21990 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
219a0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
219b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
219c0 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
219d0 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
219e0 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
219f0 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
21a00 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
21a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21a20 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
21a30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21a40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
21a60 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
21a70 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  Data, pTrunk->pg
21a80 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  no);.        put
21a90 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
21aa0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  ata[4], 0);.    
21ab0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
21ac0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
21ad0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
21ae0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46         TRACE(("F
21af0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
21b00 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
21b10 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20  acing %d\n",.   
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
21b30 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b  ge->pgno, pTrunk
21b40 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
21b50 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
21b60 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  k<0 ){.      rc 
21b70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
21b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21b90 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
21ba0 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20 61  wly freed page a
21bb0 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20  s a leaf on the 
21bc0 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f  current trunk */
21bd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21be0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
21bf0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
21c00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21c20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
21c30 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
21c40 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
21c50 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
21c60 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61  Data[8+k*4], pPa
21c70 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64  ge->pgno);.#ifnd
21c80 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
21c90 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
21ca0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21cb0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
21cc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
21cd0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
21ce0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
21cf0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
21d00 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
21d10 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
21d20 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
21d30 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
21d40 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
21d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21d60 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
21d70 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
21d80 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
21d90 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
21da0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
21db0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
21dc0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
21dd0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
21de0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
21df0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
21e00 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
21e10 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
21e20 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
21e30 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
21e40 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
21e50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21e60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21e70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
21e80 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21e90 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
21ea0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
21eb0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
21ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
21ed0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
21ee0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
21ef0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
21f00 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
21f10 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
21f20 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
21f30 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
21f40 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61  flow]);.  ovflPa
21f50 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
21f60 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
21f70 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
21f80 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
21f90 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
21fa0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
21fb0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
21fc0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
21fd0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
21fe0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
21ff0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
22000 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  l;.    if( ovflP
22010 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67  gno==0 || ovflPg
22020 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
22030 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
22040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22050 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22060 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f  }..    rc = getO
22070 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
22080 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
22090 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a  l, (nOvfl==0)?0:
220a0 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20  &ovflPgno);.    
220b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
220c0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65  rc;.    rc = fre
220d0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
220e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
220f0 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
22100 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
22110 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
22120 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
22140 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
22150 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
22160 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
22170 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
22180 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
22190 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
221a0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
221b0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
221c0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
221d0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
221e0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
221f0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
22200 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
22210 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
22220 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
22230 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
22240 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
22250 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
22260 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
22270 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
22280 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
22290 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
222a0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
222b0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
222c0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
222d0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
222e0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
222f0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
22300 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
22310 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
22320 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
22330 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
22340 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
22350 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
22360 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
22370 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
22380 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
22390 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
223a0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
223b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
223c0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
223d0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
223e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
223f0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
22400 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
22410 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
22420 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
22430 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
22440 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
22450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
22460 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
22470 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
22480 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
22490 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
224a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
224b0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
224c0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
224d0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
224e0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
224f0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
22500 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
22510 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
22520 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
22530 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
22540 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
22550 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
22560 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
22570 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22580 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
22590 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
225a0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
225b0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
225c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
225d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
225e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
225f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
22600 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
22610 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
22620 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
22630 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
22640 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
22650 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
22660 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
22670 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
22680 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
22690 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
226a0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
226b0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
226c0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
226d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
226e0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
226f0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
22700 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
22710 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
22720 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
22730 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
22740 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
22750 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
22760 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
22770 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
22780 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
22790 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
227a0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
227b0 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
227c0 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
227d0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
227e0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
227f0 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
22800 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
22810 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
22820 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
22830 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
22840 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
22850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
22860 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
22870 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
22880 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
22890 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
228a0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
228b0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
228c0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
228d0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
228e0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
228f0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
22900 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
22910 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
22920 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 2f  .  }else{ .    /
22930 2a 20 54 42 44 3a 20 20 50 65 72 68 61 70 73 20  * TBD:  Perhaps 
22940 72 61 69 73 65 20 53 51 4c 49 54 45 5f 43 4f 52  raise SQLITE_COR
22950 52 55 50 54 20 69 66 20 6e 4b 65 79 20 69 73 20  RUPT if nKey is 
22960 6c 61 72 67 65 72 20 74 68 61 6e 20 33 31 20 62  larger than 31 b
22970 69 74 73 3f 20 2a 2f 0a 20 20 20 20 6e 50 61 79  its? */.    nPay
22980 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65  load += (int)nKe
22990 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
229a0 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
229b0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
229c0 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
229d0 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
229e0 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
229f0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
22a00 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
22a10 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
22a20 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
22a30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
22a40 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
22a50 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
22a60 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
22a70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22a80 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
22a90 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
22aa0 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
22ab0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
22ac0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
22ad0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
22ae0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
22af0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
22b00 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
22b10 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
22b20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
22b30 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
22b40 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
22b50 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
22b60 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
22b70 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
22b80 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
22b90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
22ba0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
22bb0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
22bc0 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
22bd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
22be0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
22bf0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
22c00 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
22c10 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
22c20 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
22c30 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
22c40 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
22c50 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
22c60 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
22c70 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
22c80 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
22c90 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
22ca0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
22cb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
22cc0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
22cd0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
22ce0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
22cf0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
22d00 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
22d10 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
22d20 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
22d30 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
22d40 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
22d50 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
22d60 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
22d70 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
22d80 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
22d90 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
22da0 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73  itialised values
22db0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
22dc0 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
22dd0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
22de0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
22df0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
22e00 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
22e10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22e20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
22e30 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
22e40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
22e50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
22e60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
22e70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
22e80 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
22e90 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  gnoPtrmap);.    
22ea0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
22eb0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
22ec0 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
22ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
22ee0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
22ef0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
22f00 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
22f10 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
22f20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
22f30 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
22f40 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
22f50 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
22f60 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
22f70 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
22f80 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
22f90 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
22fa0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
22fb0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
22fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
22fd0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
22fe0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22ff0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
23000 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
23010 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
23020 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
23030 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
23040 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
23050 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
23060 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
23070 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
23080 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
23090 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
230a0 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
230b0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
230c0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
230d0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
230e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
230f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
23100 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
23110 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
23120 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
23130 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
23140 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
23150 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
23160 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
23170 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
23180 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
23190 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
231a0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
231b0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
231c0 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
231d0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
231e0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
231f0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
23200 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
23210 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
23220 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
23230 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
23240 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
23250 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
23260 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
23270 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
23280 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
23290 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
232a0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
232b0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
232c0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
232d0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
232e0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
232f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
23300 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
23310 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
23320 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
23330 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
23340 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
23350 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
23360 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
23370 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
23380 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
23390 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
233a0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
233b0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
233c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
233d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
233e0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
233f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
23400 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
23410 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23420 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
23430 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
23440 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
23450 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
23460 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
23470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
23480 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
23490 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
234a0 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
234b0 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
234c0 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
234d0 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
234e0 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
234f0 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
23500 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
23510 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
23520 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
23530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23540 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
23550 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
23560 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
23570 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
23580 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
23590 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
235a0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
235b0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
235c0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
235d0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
235e0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
235f0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
23600 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
23610 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
23620 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
23630 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
23640 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
23650 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
23660 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
23670 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
23680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
23690 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
236a0 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
236b0 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20   int sz){.  int 
236c0 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
236d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
236e0 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
236f0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
23700 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
23710 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
23720 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
23730 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
23740 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
23750 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
23760 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
23770 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
23780 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
23790 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
237a0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
237b0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
237c0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
237d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
237e0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
237f0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
23800 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23810 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
23820 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
23830 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
23840 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23850 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
23860 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
23870 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
23880 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
23890 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
238a0 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
238b0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
238c0 20 69 66 28 20 28 70 63 3c 70 50 61 67 65 2d 3e   if( (pc<pPage->
238d0 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
238e0 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20  ge->leaf?0:4)). 
238f0 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50      || (pc+sz>pP
23900 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
23910 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Size) ){.    ret
23920 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23930 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
23940 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
23950 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
23960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23970 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
23980 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rc;.  }.  for(i=
23990 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e  idx+1; i<pPage->
239a0 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b  nCell; i++, ptr+
239b0 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20  =2){.    ptr[0] 
239c0 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  = ptr[2];.    pt
239d0 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20  r[1] = ptr[3];. 
239e0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
239f0 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
23a00 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
23a10 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
23a20 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
23a30 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
23a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23a50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
23a60 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
23a70 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
23a80 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
23a90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
23aa0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
23ab0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
23ac0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
23ad0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
23ae0 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
23af0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
23b00 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
23b10 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
23b20 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
23b30 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
23b40 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
23b50 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
23b60 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
23b70 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
23b80 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
23b90 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  e->aOvfl[] and m
23ba0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
23bb0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
23bc0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
23bd0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
23be0 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
23bf0 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
23c00 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
23c10 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
23c20 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
23c30 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
23c40 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
23c50 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
23c60 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
23c70 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
23c80 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
23c90 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
23ca0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
23cb0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
23cc0 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
23cd0 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
23ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23cf0 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
23d00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
23d10 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
23d20 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
23d30 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
23d40 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
23d50 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
23d60 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
23d70 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
23d80 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
23d90 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
23da0 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
23db0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
23dc0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
23dd0 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
23de0 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
23df0 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
23e00 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
23e10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
23e20 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
23e30 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
23e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
23e50 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
23e60 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
23e70 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
23e80 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
23e90 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
23ea0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38  f needed */.  u8
23eb0 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   nSkip          
23ec0 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  /* Do not write 
23ed0 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
23ee0 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
23ef0 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  l */.){.  int id
23f00 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  x;          /* W
23f10 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
23f20 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
23f30 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
23f40 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
23f50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23f60 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
23f70 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23f80 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  byte of content 
23f90 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20  for any cell in 
23fa0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
23fb0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
23fc0 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
23fd0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
23fe0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
23ff0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
24000 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24010 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
24020 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
24030 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
24040 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
24050 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
24060 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68  nto data[] of th
24070 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
24080 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
24090 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
240a0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
240b0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
240c0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
240d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
240e0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
240f0 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
24100 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
24110 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
24120 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
24130 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
24140 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  /..  assert( i>=
24150 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
24160 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
24170 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
24180 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
24190 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
241a0 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
241b0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
241c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
241d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
241e0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
241f0 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  ->aOvfl) );.  as
24200 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
24210 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
24220 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
24230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24240 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
24250 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
24260 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
24270 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
24280 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
24290 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
242a0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
242b0 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
242c0 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
242d0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
242e0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
242f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
24300 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
24310 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
24320 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
24330 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
24340 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
24350 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
24360 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
24370 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
24380 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  dx = (u16)i;.   
24390 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
243a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
243b0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
243c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
243d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
243e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
243f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
24400 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
24420 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
24430 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
24440 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
24450 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
24460 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
24470 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
24480 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
24490 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
244a0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
244b0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
244c0 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
244d0 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
244e0 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
244f0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
24500 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
24510 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
24520 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
24530 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
24540 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
24550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24560 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70       }.      top
24580 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
24590 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
245a0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
245b0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
245c0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
245d0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
245e0 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
245f0 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
24600 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
24610 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
24620 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28  +5]) );.    if (
24630 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
24640 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
24650 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
24660 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24670 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
24680 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
24690 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
246a0 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
246b0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
246c0 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
246d0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
246e0 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
246f0 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
24700 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
24710 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
24720 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
24730 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
24740 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
24750 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
24760 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
24770 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
24780 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
24790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
247a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
247b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
247c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
247d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
247e0 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
247f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
24800 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
24810 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
24820 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
24830 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
24840 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
24850 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
24860 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
24870 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c   info;.      sql
24880 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
24890 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
248a0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
248b0 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
248c0 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
248d0 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
248e0 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
248f0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
24900 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
24910 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
24920 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
24930 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
24940 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
24950 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
24960 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
24970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
24980 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
24990 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
249a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
249b0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
249c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
249d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
249e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
249f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
24a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24a10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
24a20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
24a30 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
24a40 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
24a50 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
24a60 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
24a70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
24a80 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
24a90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
24aa0 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
24ab0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
24ac0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
24ad0 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
24ae0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
24af0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
24b00 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
24b10 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
24b20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
24b30 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
24b40 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
24b50 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
24b60 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
24b70 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
24b80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
24b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24ba0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
24bb0 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20  t totalSize;    
24bc0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
24bd0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20   all cells */.  
24be0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
24bf0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61    /* Index of pa
24c00 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
24c10 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20  nt cellptr;     
24c20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
24c30 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
24c40 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
24c50 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
24c60 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
24c70 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61  body */.  u8 *da
24c80 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ta;         /* D
24c90 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
24ca0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
24cb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
24cc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
24cd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24ce0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
24cf0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
24d00 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
24d10 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
24d20 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f  age->pBt) && MX_
24d30 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
24d40 3c 3d 35 34 36 30 20 29 3b 0a 20 20 74 6f 74 61  <=5460 );.  tota
24d50 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72  lSize = 0;.  for
24d60 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
24d70 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69  ++){.    totalSi
24d80 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  ze += aSize[i];.
24d90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f    }.  assert( to
24da0 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c  talSize+2*nCell<
24db0 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b  =pPage->nFree );
24dc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24dd0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
24de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
24df0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
24e00 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
24e10 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70  );.  cellptr = p
24e20 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
24e30 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
24e40 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
24e50 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
24e60 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  t;.  put2byte(&d
24e70 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c  ata[hdr+3], nCel
24e80 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20  l);.  if( nCell 
24e90 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  ){.    cellbody 
24ea0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
24eb0 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65  pPage, totalSize
24ec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
24ed0 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20  ellbody>0 );.   
24ee0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
24ef0 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c  nFree >= 2*nCell
24f00 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
24f10 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b  Free -= 2*nCell;
24f20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24f30 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
24f40 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
24f50 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c  a[cellptr], cell
24f60 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d  body);.      mem
24f70 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
24f80 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
24f90 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20  aSize[i]);.     
24fa0 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20   cellptr += 2;. 
24fb0 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d       cellbody +=
24fc0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d   aSize[i];.    }
24fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c  .    assert( cel
24fe0 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42  lbody==pPage->pB
24ff0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
25000 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
25010 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
25020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
25030 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
25040 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
25050 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
25060 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
25070 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
25080 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
25090 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
250a0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
250b0 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
250c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
250d0 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
250e0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
250f0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
25100 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
25110 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
25120 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
25130 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
25140 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
25150 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
25160 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
25170 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
25180 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
25190 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
251a0 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
251b0 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
251c0 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
251d0 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
251e0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
251f0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
25200 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
25210 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
25220 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
25230 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
25240 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
25250 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
25260 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
25270 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
25280 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
25290 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
252a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
252b0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
252c0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
252d0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
252e0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
252f0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
25300 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
25310 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  ance */../* Forw
25320 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
25330 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
25340 6e 63 65 28 42 74 43 75 72 73 6f 72 2a 2c 20 69  nce(BtCursor*, i
25350 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
25360 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
25370 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
25380 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
25390 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
253a0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
253b0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
253c0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
253d0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
253e0 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
253f0 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
25400 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
25410 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
25420 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
25430 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
25440 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
25450 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
25460 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
25470 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
25480 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
25490 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
254a0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
254b0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
254c0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
254d0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
254e0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
254f0 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
25500 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
25510 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
25520 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
25530 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
25540 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
25550 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
25560 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
25570 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
25580 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
25590 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
255a0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
255b0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
255c0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
255d0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
255e0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
255f0 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
25600 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
25610 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
25620 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
25630 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
25640 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
25650 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
25660 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
25670 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
25680 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
25690 65 5f 71 75 69 63 6b 28 42 74 43 75 72 73 6f 72  e_quick(BtCursor
256a0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
256b0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
256c0 65 77 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70  ew = 0;.  Pgno p
256d0 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43  gnoNew;.  u8 *pC
256e0 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c  ell;.  u16 szCel
256f0 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  l;.  CellInfo in
25700 66 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  fo;.  MemPage *p
25710 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
25720 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25730 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
25740 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
25750 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
25760 31 5d 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  1];.  BtShared *
25770 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
25780 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64  ;.  int parentId
25790 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  x = pParent->nCe
257a0 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74  ll;   /* pParent
257b0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
257c0 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
257d0 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20   parentSize;    
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
257f0 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69  * Size of new di
25800 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
25810 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34  u8 parentCell[64
25820 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
25830 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74    /* Space for t
25840 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
25850 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ell */..  assert
25860 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25870 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
25880 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
25890 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
258a0 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65  page. Insert the
258b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
258c0 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69  rom pPage.  ** i
258d0 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d  nto it. Then rem
258e0 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ove the overflow
258f0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
25900 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
25910 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
25920 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
25930 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  oNew, 0, 0);.  i
25940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25950 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   ){.    pCell = 
25960 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
25970 70 43 65 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c  pCell;.    szCel
25980 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
25990 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
259a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
259b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
259c0 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
259d0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
259e0 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
259f0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  Data[0]);.    as
25a00 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
25a10 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
25a20 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
25a30 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
25a40 20 20 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20    .    /* pPage 
25a50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
25a60 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
25a70 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
25a80 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74  this.    ** so t
25a90 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  hat the right-ch
25aa0 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70  ild is the new p
25ab0 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62  age allocated ab
25ac0 6f 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70  ove and.    ** p
25ad0 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
25ae0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
25af0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
25b00 49 67 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72  Ignore the retur
25b10 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  n value of the c
25b20 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c  all to fillInCel
25b30 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  l(). fillInCell(
25b40 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c  ).    ** may onl
25b50 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74  y return other t
25b60 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
25b70 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20   it is required 
25b80 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
25b90 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  ** one or more o
25ba0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53  verflow pages. S
25bb0 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c  ince an internal
25bc0 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65   table B-Tree ce
25bd0 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ll .    ** may n
25be0 65 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20  ever spill over 
25bf0 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  onto an overflow
25c00 20 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d   page (it is a m
25c10 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a  aximum of .    *
25c20 2a 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  * 13 bytes in si
25c30 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e  ze), it is not n
25c40 65 63 63 65 73 73 61 72 79 20 74 6f 20 63 68 65  eccessary to che
25c50 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
25c60 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
25c70 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  * Similarly, the
25c80 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75   insertCell() fu
25c90 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
25ca0 69 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20  il if the page. 
25cb0 20 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65     ** being inse
25cc0 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72  rted into is alr
25cd0 65 61 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e  eady writable an
25ce0 64 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  d the cell does 
25cf0 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  not .    ** cont
25d00 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ain an overflow 
25d10 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f  pointer. So igno
25d20 72 65 20 74 68 69 73 20 72 65 74 75 72 6e 20 63  re this return c
25d30 6f 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ode too..    */.
25d40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
25d50 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
25d60 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
25d70 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
25d80 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73  >nCell-1);.    s
25d90 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
25da0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
25db0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
25dc0 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61    fillInCell(pPa
25dd0 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
25de0 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
25df0 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  0, 0, 0, &parent
25e00 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
25e10 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
25e20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25e30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
25e40 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
25e50 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
25e60 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
25e70 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20  ent, parentIdx, 
25e80 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65  parentCell, pare
25e90 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20  ntSize, 0, 4);. 
25ea0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
25eb0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
25ec0 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
25ed0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
25ee0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
25ef0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
25f00 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
25f10 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
25f20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
25f30 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
25f40 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
25f50 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
25f60 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
25f70 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
25f80 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
25f90 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
25fa0 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
25fb0 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
25fc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
25fd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
25fe0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
25ff0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
26000 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
26010 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
26020 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
26030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26050 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
26060 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20  Ovfl(pNew, 0);. 
26070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26080 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
26090 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
260a0 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
260b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
260c0 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  New);.  }..  /* 
260d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
260e0 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76  e pPage->nFree v
260f0 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73  ariable is not s
26100 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74  et correctly wit
26110 68 0a 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74  h.  ** respect t
26120 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
26130 20 74 68 65 20 70 61 67 65 20 28 62 65 63 61 75   the page (becau
26140 73 65 20 69 74 20 77 61 73 20 73 65 74 20 74 6f  se it was set to
26150 20 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65   0 by .  ** inse
26160 72 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c  rtCell). So call
26170 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
26180 74 50 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20  tPage() to make 
26190 73 75 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  sure it is.  ** 
261a0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20  correct..  **.  
261b0 2a 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  ** This has to b
261c0 65 20 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61  e done even if a
261d0 6e 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  n error will be 
261e0 72 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c  returned. Normal
261f0 6c 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65  ly, if.  ** an e
26200 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
26210 6e 67 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e  ng tree balancin
26220 67 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  g, the contents 
26230 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20  of MemPage are. 
26240 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   ** not importan
26250 74 2c 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20  t, as they will 
26260 62 65 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20  be recalculated 
26270 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  when the page is
26280 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
26290 6b 2e 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20  k. But here, in 
262a0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c  balance_quick(),
262b0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
262c0 74 68 61 74 20 70 50 61 67 65 20 68 61 73 20 0a  that pPage has .
262d0 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65    ** not yet bee
262e0 6e 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f  n marked dirty o
262f0 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  r written into t
26300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
26310 20 54 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20   Therefore.  ** 
26320 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72  it will not be r
26330 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73  olled back and s
26340 6f 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  o it is importan
26350 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
26360 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  hat.  ** the pag
26370 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65  e data and conte
26380 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
26390 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  re consistent.. 
263a0 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   */.  pPage->isI
263b0 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nit = 0;.  sqlit
263c0 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
263d0 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  pPage);.  assert
263e0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
263f0 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ow==0 );..  /* I
26400 66 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  f everything els
26410 65 20 73 75 63 63 65 65 64 65 64 2c 20 62 61 6c  e succeeded, bal
26420 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
26430 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63  page, in .  ** c
26440 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20  ase the divider 
26450 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61  cell inserted ca
26460 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d  used it to becom
26470 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f  e overfull..  */
26480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
264a0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
264b0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
264c0 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  -;.    rc = bala
264d0 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  nce(pCur, 0);.  
264e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
264f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
26500 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
26510 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
26520 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
26530 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
26540 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
26550 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
26560 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
26570 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
26580 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
26590 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
265a0 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
265b0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
265c0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
265d0 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
265e0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
265f0 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
26600 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
26610 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
26620 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
26630 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
26640 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
26650 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
26660 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
26670 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
26680 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
26690 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
266a0 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
266b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
266c0 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
266d0 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
266e0 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
266f0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
26700 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
26710 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
26720 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
26730 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
26740 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
26750 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
26760 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
26770 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
26780 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
26790 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
267a0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
267b0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
267c0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
267d0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
267e0 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
267f0 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
26800 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
26810 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
26820 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
26830 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
26840 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
26850 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
26860 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
26870 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
26880 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
26890 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
268a0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
268b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
268c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
268d0 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
268e0 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
268f0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
26900 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
26910 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
26920 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
26930 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
26940 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
26950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26960 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
26970 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
26980 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
26990 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
269a0 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
269b0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
269c0 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
269d0 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
269e0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
269f0 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
26a00 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
26a10 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
26a20 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
26a30 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26a40 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
26a50 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
26a60 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
26a70 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
26a80 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
26a90 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
26aa0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
26ab0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
26ac0 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
26ad0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
26ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
26af0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
26b00 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
26b10 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
26b20 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  nroot(BtCursor *
26b30 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
26b40 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
26b50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 76 65        /* The ove
26b60 72 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 70  r or underfull p
26b70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a  age to balance *
26b80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
26b90 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
26ba0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
26bb0 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53  f pPage */.  BtS
26bc0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
26bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26be0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
26bf0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
26c00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26c10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
26c20 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
26c30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
26c40 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
26c50 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
26c60 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
26c70 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
26c80 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30  /.  int nOld = 0
26c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26ca0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
26cb0 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
26cc0 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
26cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26ce0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
26cf0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
26d00 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
26d30 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
26d40 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d60 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
26d70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
26da0 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
26db0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
26dc0 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26de0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
26df0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
26e00 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
26e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
26e30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
26e40 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
26e50 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
26e60 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
26e70 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
26e80 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
26e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26ea0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
26eb0 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
26ec0 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
26ed0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
26ee0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
26ef0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
26f00 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
26f10 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
26f20 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
26f30 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
26f40 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
26f50 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
26f60 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
26f70 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
26f80 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
26f90 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
26fa0 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
26fb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26fc0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
26fd0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
26fe0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  [] */.  int iSpa
26ff0 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce2 = 0;        
27000 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
27010 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
27020 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace2[] */.  int 
27030 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
27040 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27050 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
27060 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
27070 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
27080 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
27090 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
270a0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
270b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
270c0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
270d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
270e0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
270f0 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
27100 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
27110 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
27120 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
27130 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
27140 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
27150 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
27160 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
27170 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
27180 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
27190 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
271a0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
271b0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
271c0 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
271d0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
271e0 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27200 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
27210 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
27220 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
27230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27240 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
27250 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
27260 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
27270 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
27280 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
27290 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
272a0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
272b0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
272c0 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
272d0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
272e0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
272f0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
27300 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
27310 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
27320 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
27330 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
27340 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
27350 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
27360 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
27370 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
27380 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
27390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
273a0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
273b0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
273c0 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20   before balance 
273d0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32  */.  u8 *aSpace2
273e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53   = 0;       /* S
273f0 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f  pace for overflo
27400 77 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  w dividers cells
27410 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a   after balance *
27420 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20  /.  u8 *aFrom = 
27430 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
27440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27450 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
27460 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27470 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
27480 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 56 56  ->mutex) );.  VV
27490 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
274a0 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20  gesShuffled = 1 
274b0 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46  );..  /* .  ** F
274c0 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70  ind the parent p
274d0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
274e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
274f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27500 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
27510 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27520 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27530 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27540 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ) || pPage->nOve
27550 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42  rflow==1 );.  pB
27560 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
27570 20 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72    pParent = pCur
27580 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27590 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72  Page-1];.  asser
275a0 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20  t( pParent );.  
275b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
275c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
275d0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
275e0 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
275f0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27600 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52  eanup;.  }..  TR
27610 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
27620 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
27630 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
27640 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
27650 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e  t->pgno));..#ifn
27660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27670 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f  QUICKBALANCE.  /
27680 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c  *.  ** A special
27690 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77   case:  If a new
276a0 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20   entry has just 
276b0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
276c0 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20  to a.  ** table 
276d0 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65  (that is, a btre
276e0 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b  e with integer k
276f0 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  eys and all data
27700 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a   at the leaves).
27710 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77    ** and the new
27720 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69   entry is the ri
27730 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
27740 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68  n the tree (it h
27750 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67  as the.  ** larg
27760 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73  est key) then us
27770 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61  e the special ba
27780 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f  lance_quick() ro
27790 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62  utine for.  ** b
277a0 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e  alancing.  balan
277b0 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75  ce_quick() is mu
277c0 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65  ch faster and re
277d0 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74  sults in a tight
277e0 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20  er.  ** packing 
277f0 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63  of data in the c
27800 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f  ommon case..  */
27810 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
27820 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  af &&.      pPag
27830 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20  e->intKey &&.   
27840 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
27850 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20  low==1 &&.      
27860 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
27870 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
27880 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61 72 65  l &&.      pPare
27890 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
278a0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
278b0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
278c0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
278d0 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
278e0 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  o.  ){.    asser
278f0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
27900 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   );.    /*.    *
27910 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
27920 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
27930 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
27940 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
27950 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
27960 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
27970 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
27980 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
27990 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
279a0 71 75 69 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d  quick(pCur);.  }
279b0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53  .#endif..  if( S
279c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
279d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
279e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
279f0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  )) ){.    goto b
27a00 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27a10 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
27a20 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
27a30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
27a40 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
27a50 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
27a60 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
27a70 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
27a80 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
27a90 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
27aa0 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
27ab0 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
27ac0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
27ad0 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
27ae0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
27af0 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
27b00 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27b10 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 50 61 72  -1];.  assertPar
27b20 65 6e 74 49 6e 64 65 78 28 70 50 61 72 65 6e 74  entIndex(pParent
27b30 2c 20 69 64 78 2c 20 70 50 61 67 65 2d 3e 70 67  , idx, pPage->pg
27b40 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
27b50 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
27b60 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
27b70 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
27b80 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
27b90 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
27ba0 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
27bb0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
27bc0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
27bd0 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
27be0 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
27bf0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
27c00 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
27c10 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
27c20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
27c30 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
27c40 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
27c50 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
27c60 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
27c70 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
27c80 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
27c90 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
27ca0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
27cb0 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
27cc0 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
27cd0 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
27ce0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
27cf0 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
27d00 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
27d10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
27d20 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
27d30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
27d40 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
27d50 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
27d60 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
27d70 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
27d80 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
27d90 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
27da0 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
27db0 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
27dc0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
27dd0 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
27de0 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
27df0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
27e00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
27e10 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
27e20 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
27e30 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
27e40 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
27e50 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
27e60 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
27e70 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
27e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27e90 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
27ea0 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
27eb0 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
27ec0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
27ed0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27ee0 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d      /* apOld[i]-
27ef0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20  >idxParent = k; 
27f00 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d  */.    apCopy[i]
27f10 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
27f20 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20  ( i==nOld );.   
27f30 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61   nOld++;.    nMa
27f40 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
27f50 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
27f60 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
27f70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
27f80 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
27f90 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
27fa0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
27fb0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
27fc0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
27fd0 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
27fe0 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
27ff0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
28000 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
28010 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
28020 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
28030 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
28040 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
28070 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
28080 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
280b0 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65    + (ROUND8(size
280c0 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74  of(MemPage))+pBt
280d0 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20  ->pageSize)*NB  
280e0 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
280f0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28120 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
28130 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
28140 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
28150 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
28160 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70  /* aFrom */.  ap
28170 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
28180 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
28190 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
281a0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
281b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
281c0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
281d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
281e0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
281f0 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
28200 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
28210 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
28220 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
28230 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
28240 30 5d 20 2d 20 28 75 38 2a 29 30 29 20 26 20 37  0] - (u8*)0) & 7
28250 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
28260 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
28270 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ired */.  for(i=
28280 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20  1; i<NB; i++){. 
28290 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61     aCopy[i] = &a
282a0 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70  Copy[i-1][pBt->p
282b0 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
282c0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
282d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
282e0 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29  aCopy[i] - (u8*)
282f0 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  0) & 7)==0 ); /*
28300 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
28310 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
28320 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61  }.  aSpace1 = &a
28330 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
28340 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
28350 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
28360 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
28370 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29 30 29  Space1 - (u8*)0)
28380 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
28390 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
283a0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
283b0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
283c0 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
283d0 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
283e0 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70  Size];.  }.  aSp
283f0 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61  ace2 = sqlite3Pa
28400 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61  geMalloc(pBt->pa
28410 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61  geSize);.  if( a
28420 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20  Space2==0 ){.   
28430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
28440 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
28450 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28460 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  }.  .  /*.  ** M
28470 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
28480 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
28490 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
284a0 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
284b0 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
284c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
284d0 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
284e0 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
284f0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
28500 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
28510 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
28520 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
28530 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
28540 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
28550 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
28560 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
28570 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
28580 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
28590 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
285a0 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
285b0 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
285c0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
285d0 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
285e0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
285f0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
28600 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
28610 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
28620 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
28630 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
28640 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
28650 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
28660 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
28670 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
28680 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
28690 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
286a0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
286b0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
286c0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
286d0 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
286e0 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
286f0 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
28700 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
28710 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
28720 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
28730 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
28740 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
28750 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
28760 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
28770 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
28780 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
28790 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
287a0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
287b0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
287c0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
287d0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
287e0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
287f0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
28800 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
28810 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
28820 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
28830 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
28840 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
28850 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
28860 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
28870 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
28880 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
28890 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
288a0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
288b0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
288c0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
288d0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
288e0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
288f0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
28900 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
28910 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
28920 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
28930 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
28940 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61  Correction = pPa
28950 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  ge->leaf*4;.  le
28960 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  afData = pPage->
28970 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
28980 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
28990 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
289a0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b  Old = apCopy[i];
289b0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
289c0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
289d0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
289e0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
289f0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
28a00 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
28a10 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
28a20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
28a30 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
28a40 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
28a50 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
28a60 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
28a70 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
28a80 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  ]);.      if( IS
28a90 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
28aa0 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
28ab0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
28ac0 5d 20 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73  ] = (u8)i;   ass
28ad0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36  ert( i>=0 && i<6
28ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
28af0 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76  a=0; a<pOld->nOv
28b00 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20  erflow; a++){.  
28b10 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
28b20 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c  ->aOvfl[a].pCell
28b30 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  ==apCell[nCell] 
28b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
28b50 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
28b60 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF;.            
28b70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
28b80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28b90 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
28ba0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
28bb0 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
28bc0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c      u16 sz = cel
28bd0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
28be0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
28bf0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
28c00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
28c10 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
28c20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
28c30 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
28c40 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
28c50 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
28c60 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
28c70 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
28c80 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
28c90 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
28ca0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
28cb0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
28cc0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
28cd0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
28ce0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
28cf0 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
28d00 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
28d10 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
28d20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
28d30 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
28d40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
28d50 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
28d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
28d70 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
28d80 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
28d90 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
28da0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
28db0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
28dc0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
28dd0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
28de0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
28df0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28e00 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
28e10 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20  ze/4 );.        
28e20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c  assert( iSpace1<
28e30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
28e40 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
28e50 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
28e60 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
28e70 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
28e80 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
28e90 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
28ea0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
28eb0 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d  .          aFrom
28ec0 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
28ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28ee0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
28ef0 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
28f00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28f10 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
28f20 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
28f30 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
28f40 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
28f50 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72  -= (u16)leafCorr
28f60 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
28f70 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
28f80 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64  (pTemp)==pgnoOld
28f90 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  [i] );.        i
28fa0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
28fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
28fc0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
28fd0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
28fe0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
28ff0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
29000 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
29010 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
29020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
29030 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
29040 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
29050 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
29060 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
29070 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68  d->aData[pOld->h
29080 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b  drOffset+8], 4);
29090 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
290a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
290b0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
290c0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==4 );.         
290d0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
290e0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
290f0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
29100 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
29110 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
29120 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
29130 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
29140 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
29150 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29160 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
29170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
29180 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
29190 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
291a0 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
291b0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
291c0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
291d0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
291e0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
291f0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
29200 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
29210 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
29220 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
29230 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
29240 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
29250 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
29260 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
29270 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
29280 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
29290 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
292a0 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
292b0 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
292c0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
292d0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
292e0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
292f0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
29300 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
29310 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
29320 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
29330 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
29340 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
29350 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
29360 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
29370 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
29380 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
29390 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
293a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
293b0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
293c0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
293d0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
293e0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
293f0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
29400 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
29410 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
29420 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
29430 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
29440 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
29450 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
29460 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
29470 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
29480 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
29490 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
294a0 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
294b0 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
294c0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
294d0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
294e0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
294f0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
29500 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
29510 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
29520 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
29530 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
29540 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
29550 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
29560 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
29570 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
29580 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
29590 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
295a0 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
295b0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
295c0 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
295d0 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
295e0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
295f0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
29600 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
29610 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
29620 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
29630 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
29640 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
29650 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
29660 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
29670 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
29680 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
29690 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
296a0 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
296b0 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
296c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
296d0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
296e0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
296f0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
29700 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
29710 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
29720 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
29730 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
29740 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
29750 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
29760 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
29770 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
29780 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
29790 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
297a0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
297b0 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
297c0 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
297d0 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
297e0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
297f0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
29800 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
29810 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
29820 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
29830 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
29840 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
29850 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29860 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
29870 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
29880 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298a0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
298b0 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
298c0 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
298d0 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
298e0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
298f0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
29900 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
29910 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
29920 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29930 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
29940 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
29950 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
29960 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
29970 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
29980 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
29990 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
299a0 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
299b0 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
299c0 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
299d0 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
299e0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
299f0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
29a00 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
29a10 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
29a20 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
29a30 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
29a40 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
29a50 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
29a60 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
29a70 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
29a80 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
29a90 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
29aa0 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
29ab0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
29ac0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
29ad0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
29ae0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
29af0 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
29b00 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
29b10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29b20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
29b30 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
29b40 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
29b50 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
29b60 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
29b70 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
29b80 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
29b90 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
29ba0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29bb0 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
29bc0 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
29bd0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
29be0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
29bf0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
29c00 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
29c10 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
29c20 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
29c30 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
29c40 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
29c50 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
29c60 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
29c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29c80 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
29c90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
29ca0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
29cb0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
29cc0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
29cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
29ce0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
29cf0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
29d00 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
29d10 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
29d20 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
29d30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
29d40 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
29d50 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
29d60 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
29d70 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
29d80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
29d90 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
29da0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
29db0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
29dc0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
29dd0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
29de0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
29df0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
29e00 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
29e10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
29e20 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
29e30 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
29e40 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
29e50 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
29e60 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
29e70 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
29e80 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
29e90 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
29ea0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
29eb0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
29ec0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
29ed0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
29ee0 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
29ef0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
29f00 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
29f10 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
29f20 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
29f30 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
29f40 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
29f50 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
29f60 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
29f70 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
29f80 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
29f90 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
29fa0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
29fb0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
29fc0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
29fd0 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
29fe0 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
29ff0 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
2a000 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
2a010 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
2a020 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
2a030 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
2a040 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
2a050 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
2a060 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
2a070 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2a080 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
2a090 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
2a0a0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
2a0b0 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
2a0c0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
2a0d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
2a0e0 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
2a0f0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
2a100 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
2a110 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
2a120 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
2a130 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2a140 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
2a150 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
2a160 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
2a170 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
2a180 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
2a190 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
2a1a0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
2a1b0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
2a1c0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
2a1d0 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
2a1e0 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
2a1f0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
2a200 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
2a210 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a220 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
2a230 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
2a240 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2a250 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
2a260 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
2a270 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
2a280 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
2a290 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
2a2a0 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
2a2b0 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
2a2c0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
2a2d0 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
2a2e0 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
2a2f0 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
2a300 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
2a310 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
2a320 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
2a330 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
2a340 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
2a350 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
2a360 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
2a370 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
2a380 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
2a390 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
2a3a0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
2a3b0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
2a3c0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
2a3d0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
2a3e0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
2a3f0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
2a400 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
2a410 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2a420 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
2a430 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2a440 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
2a450 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
2a460 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
2a470 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
2a480 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
2a490 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2a4a0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
2a4b0 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
2a4c0 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a  oNew[i] );.    z
2a4d0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
2a4e0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
2a4f0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2a500 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
2a510 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
2a520 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
2a530 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
2a540 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
2a550 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
2a560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2a570 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
2a580 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2a590 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2a5a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2a5b0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2a5c0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
2a5d0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
2a5e0 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
2a5f0 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
2a600 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
2a610 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
2a620 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
2a630 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
2a640 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
2a650 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
2a660 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
2a670 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
2a680 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2a690 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2a6a0 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
2a6b0 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
2a6c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
2a6d0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2a6e0 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
2a6f0 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
2a700 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
2a710 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
2a720 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a730 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2a740 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
2a750 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a760 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f  ITE_OK && leafCo
2a770 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  rrection==0 ){. 
2a780 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2a790 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2a7a0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b  et4byte(apCell[k
2a7b0 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
2a7c0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
2a7d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a7e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a800 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2a810 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2a820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a830 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2a840 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
2a850 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
2a860 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
2a870 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
2a880 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
2a890 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
2a8a0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
2a8b0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2a8c0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2a8d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2a8e0 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
2a8f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
2a900 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
2a910 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2a920 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
2a930 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
2a940 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
2a950 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
2a960 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
2a970 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
2a980 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
2a990 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53  mp = &aSpace2[iS
2a9a0 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66  pace2];.      if
2a9b0 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
2a9c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2a9d0 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
2a9e0 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
2a9f0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2aa00 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26  CUUM .         &
2aa10 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46  & (aFrom[j]==0xF
2aa20 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
2aa30 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[j]]->pgno!=pNe
2aa40 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20  w->pgno).       
2aa50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2aa60 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2aa70 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2aa80 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2aa90 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2aaa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2aab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2aac0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2aad0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2aae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2aaf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2ab00 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2ab10 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2ab20 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
2ab30 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
2ab40 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2ab50 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
2ab60 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
2ab70 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
2ab80 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
2ab90 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
2aba0 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
2abb0 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
2abc0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
2abd0 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
2abe0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
2abf0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
2ac00 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
2ac10 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
2ac20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ac30 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2ac40 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
2ac50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2ac60 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2ac70 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
2ac80 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2ac90 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2aca0 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
2acb0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
2acc0 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
2acd0 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  , 0, 0, 0, &sz);
2ace0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
2acf0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2ad00 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
2ad10 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
2ad20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
2ad30 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
2ad40 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
2ad50 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
2ad60 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
2ad70 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
2ad80 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
2ad90 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
2ada0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
2adb0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
2adc0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
2add0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
2ade0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
2adf0 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
2ae00 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
2ae10 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
2ae20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
2ae30 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
2ae40 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
2ae50 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
2ae60 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
2ae70 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
2ae80 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
2ae90 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
2aea0 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
2aeb0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
2aec0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
2aed0 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
2aee0 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
2aef0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
2af00 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
2af10 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
2af20 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
2af30 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
2af40 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
2af50 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
2af60 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
2af70 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
2af80 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2af90 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2afa0 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
2afb0 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
2afc0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
2afd0 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
2afe0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2aff0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
2b000 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b010 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20 73 7a     iSpace2 += sz
2b020 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b030 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
2b040 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
2b050 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d 70 42  ert( iSpace2<=pB
2b060 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
2b070 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2b080 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2b090 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
2b0a0 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20  pTemp, 4);.     
2b0b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b0c0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
2b0d0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2b0e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b0f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b100 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2b110 65 29 20 29 3b 0a 20 20 20 20 20 20 70 75 74 34  e) );.      put4
2b120 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2b130 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78  wCell(pParent,nx
2b140 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Div), pNew->pgno
2b150 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2b160 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2b170 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2b180 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
2b190 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
2b1a0 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
2b1b0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2b1c0 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
2b1d0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2b1e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
2b1f0 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
2b200 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
2b210 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
2b220 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2b230 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2b240 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20  !leafData ){.   
2b250 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b260 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c  PutOvfl(pParent,
2b270 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20   nxDiv);.       
2b280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2b2a0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2b2b0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
2b2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b        }.      j+
2b2d0 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
2b2e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2b2f0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
2b300 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
2b310 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2b320 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ge. */.    if( I
2b330 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b340 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b350 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
2b360 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2b370 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2b380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2b390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b3a0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2b3b0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2b3c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2b3d0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
2b3e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
2b3f0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
2b400 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
2b410 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
2b420 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
2b430 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
2b440 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
2b450 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
2b460 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
2b470 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
2b480 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20  zChild, 4);.    
2b490 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2b4a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2b4b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2b4c0 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20  t4byte(zChild), 
2b4d0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
2b4e0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
2b4f0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2b500 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b510 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2b520 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2b530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2b540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b550 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b560 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2b570 65 29 20 29 3b 0a 20 20 69 66 28 20 6e 78 44 69  e) );.  if( nxDi
2b580 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  v==pParent->nCel
2b590 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  l+pParent->nOver
2b5a0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52  flow ){.    /* R
2b5b0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2b5c0 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  g is the right-m
2b5d0 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
2b5e0 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34  rent */.    put4
2b5f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2b600 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2b610 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2b620 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
2b630 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69  }else{.    /* Ri
2b640 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2b650 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69   is the left chi
2b660 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ld of the first 
2b670 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74  entry in pParent
2b680 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
2b690 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69   right-most divi
2b6a0 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  der entry */.   
2b6b0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
2b6c0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
2b6d0 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f  nt, nxDiv), pgno
2b6e0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
2b6f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  }..  /*.  ** Bal
2b700 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
2b710 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
2b720 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2b730 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
2b740 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
2b750 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2b760 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
2b770 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
2b780 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
2b790 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
2b7a0 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
2b7b0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
2b7c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2b7d0 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
2b7e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2b7f0 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2b800 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20    apCell = 0;.  
2b810 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2b820 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
2b830 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
2b840 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
2b850 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
2b860 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
2b870 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 70 50 61 67   nCell));.  pPag
2b880 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
2b890 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2b8a0 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
2b8b0 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20  iPage--;.  rc = 
2b8c0 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
2b8d0 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ;.  .  /*.  ** C
2b8e0 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
2b8f0 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
2b900 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
2b910 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2b920 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71 6c  (aSpace2);.  sql
2b930 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
2b940 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
2b950 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2b960 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2b970 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
2b980 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
2b990 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
2b9a0 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
2b9b0 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  i]);.  }.  pCur-
2b9c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b9d0 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  age]->nOverflow 
2b9e0 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  = 0;..  return r
2b9f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2ba00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ba10 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
2ba20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
2ba30 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
2ba40 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2ba50 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
2ba60 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
2ba70 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
2ba80 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
2ba90 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
2baa0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2bab0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74 43  ce_shallower(BtC
2bac0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2bad0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2baf0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d 54  Root page of B-T
2bb00 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2bb10 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20   *pChild;       
2bb20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
2bb30 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20  y child page of 
2bb40 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  pPage */.  Pgno 
2bb50 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
2bb60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2bb70 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c  number for pChil
2bb80 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
2bb90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2bba0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2bbb0 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
2bbc0 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61  dures */.  BtSha
2bbd0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2bbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2bbf0 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72  e main BTree str
2bc00 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
2bc10 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
2bc20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2bc30 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
2bc40 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a  lls per page */.
2bc50 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bc70 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * All cells from
2bc80 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
2bc90 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2bca0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2bcb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2bcc0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2bcd0 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ls */..  assert(
2bce0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2bcf0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2bd00 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20  r->apPage[0];.. 
2bd10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2bd20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2bd30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2bd40 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2bd50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2bd60 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2bd70 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61  t;.  mxCellPerPa
2bd80 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74  ge = MX_CELL(pBt
2bd90 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  );.  apCell = sq
2bda0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43  lite3Malloc( mxC
2bdb0 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
2bdc0 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
2bdd0 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
2bde0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2bdf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2be00 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2be10 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
2be20 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
2be30 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2be40 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
2be50 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
2be60 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
2be70 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
2be80 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
2be90 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
2bea0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
2beb0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2bec0 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
2bed0 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
2bee0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
2bef0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
2bf00 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
2bf10 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
2bf20 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
2bf30 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
2bf40 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
2bf50 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
2bf60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2bf70 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
2bf80 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
2bf90 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
2bfa0 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
2bfb0 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
2bfc0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
2bfd0 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
2bfe0 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
2bff0 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
2c000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
2c010 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
2c020 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
2c030 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
2c040 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2c050 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
2c060 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
2c070 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
2c080 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
2c090 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
2c0a0 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
2c0b0 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
2c0c0 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
2c0d0 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
2c0e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
2c0f0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2c100 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
2c110 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
2c120 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
2c130 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
2c140 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75     VVA_ONLY( pCu
2c150 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
2c160 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f   = 1 );.    pgno
2c170 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2c180 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c190 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c1a0 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
2c1b0 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
2c1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2c1d0 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65  Child<=pagerPage
2c1e0 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74  count(pPage->pBt
2c1f0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
2c200 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2c210 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  e(pPage->pBt, pg
2c220 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64  noChild, &pChild
2c230 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2c240 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2c250 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2c260 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f   if( pPage->pgno
2c270 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
2c280 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2c290 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
2c2a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2c2b0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2c2c0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61  balance;.      a
2c2d0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2c2e0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
2c2f0 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d       if( pChild-
2c300 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20  >nFree>=100 ){. 
2c310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2c320 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ild information 
2c330 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2c340 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f  root page, so do
2c350 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2c360 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  copy */.        
2c370 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a  int i;.        z
2c380 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2c390 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29  Child->aData[0])
2c3a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2c3b0 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
2c3c0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
2c3d0 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20      apCell[i] = 
2c3e0 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c  findCell(pChild,
2c3f0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  i);.          sz
2c400 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  Cell[i] = cellSi
2c410 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70  zePtr(pChild, ap
2c420 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Cell[i]);.      
2c430 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2c440 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20  mblePage(pPage, 
2c450 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61  pChild->nCell, a
2c460 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a  pCell, szCell);.
2c470 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
2c480 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
2c490 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74  r of the child t
2c4a0 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
2c4b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c4c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c4d0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c4e0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2c4f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2c500 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2c510 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2c520 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
2c530 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61  4byte(&pChild->a
2c540 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72  Data[pChild->hdr
2c550 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2c560 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2c570 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2c580 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2c590 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72  NCE: child %d tr
2c5a0 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31  ansfer to page 1
2c5b0 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2c5c0 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  o));.      }else
2c5d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2c5e0 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20   child has more 
2c5f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
2c600 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2c610 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a   root..        *
2c620 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c  * The tree is al
2c630 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20  ready balanced. 
2c640 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   Do nothing. */.
2c650 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2c660 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2c670 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  d will not fit o
2c680 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  n page 1\n", pCh
2c690 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2c6a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2c6b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2c6c0 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c  ge->aData, pChil
2c6d0 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d  d->aData, pPage-
2c6e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2c6f0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
2c700 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
2c710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c720 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
2c730 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
2c740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c750 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
2c760 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2c770 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2c780 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
2c790 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
2c7a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2c7b0 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
2c7c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2c7d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2c7e0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c7f0 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ow==0 );.#ifndef
2c800 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c810 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2c820 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2c830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43  .      rc = setC
2c850 68 69 6c 64 50 74 72 6d 61 70 73 28 70 50 61 67  hildPtrmaps(pPag
2c860 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
2c870 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2c880 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e  (pChild);.  }.en
2c890 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2c8a0 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  e:.  sqlite3_fre
2c8b0 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e(apCell);.  ret
2c8c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2c8d0 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2c8e0 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a  is overfull.**.*
2c8f0 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70  * When this happ
2c900 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65  ens, Create a ne
2c910 77 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64  w child page and
2c920 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e   copy the.** con
2c930 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
2c940 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  t into the child
2c950 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65  .  Then make the
2c960 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e   root.** page an
2c970 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
2c980 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e   rightChild poin
2c990 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a  ting to the new.
2c9a0 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61  ** child.   Fina
2c9b0 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  lly, call balanc
2c9c0 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20  e_internal() on 
2c9d0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a  the new child.**
2c9e0 20 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20   to cause it to 
2c9f0 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  split..*/.static
2ca00 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
2ca10 70 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  per(BtCursor *pC
2ca20 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ur){.  int rc;  
2ca30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ca40 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
2ca50 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2ca60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2ca70 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
2ca80 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
2ca90 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
2caa0 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
2cab0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
2cac0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2cad0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
2cae0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2caf0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
2cb00 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
2cb10 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2cb20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
2cb30 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
2cb40 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
2cb50 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
2cb60 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
2cb70 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2cb80 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2cb90 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2cba0 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
2cbb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2cbc0 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
2cbd0 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2cbe0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
2cbf0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
2cc00 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
2cc10 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  nt */.  int cbrk
2cc20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2cc30 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
2cc40 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
2cc50 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
2cc60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2cc70 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
2cc80 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2cc90 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  0]->nOverflow>0 
2cca0 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  );..  VVA_ONLY( 
2ccb0 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
2ccc0 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 70 50 61  led = 1 );.  pPa
2ccd0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2cce0 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50  e[0];.  pBt = pP
2ccf0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
2cd00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2cd10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2cd20 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2cd30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2cd40 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2cd50 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 63 20  DbPage) );.  rc 
2cd60 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2cd70 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
2cd80 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
2cd90 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
2cda0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2cdb0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
2cdc0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2cdd0 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
2cde0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
2cdf0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
2ce00 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
2ce10 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2ce20 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2ce30 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62  >hdrOffset;.  cb
2ce40 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2ce50 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2ce60 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2ce70 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2ce80 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2ce90 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2cea0 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2ceb0 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2cec0 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20  y(&cdata[cbrk], 
2ced0 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
2cee0 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a  bleSize-cbrk);..
2cef0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2cf00 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
2cf10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2cf20 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2cf30 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2cf40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2cf50 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67 65  nt nCopy = pPage
2cf60 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2cf70 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2cf80 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0]);.    memcpy(
2cf90 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
2cfa0 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f  Page->aOvfl, nCo
2cfb0 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d  py);.    pChild-
2cfc0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
2cfd0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
2cfe0 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
2cff0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2d000 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2d010 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
2d020 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2d030 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2d040 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ll );.    assert
2d050 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2d060 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2d070 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2d080 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2d090 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2d0a0 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
2d0b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2d0c0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2d0d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2d0e0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
2d0f0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2d100 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
2d110 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
2d120 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
2d130 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49  gno));.    if( I
2d140 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2d150 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2d160 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d  Put(pBt, pChild-
2d170 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2d180 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  REE, pPage->pgno
2d190 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2d1a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2d1b0 4d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  M.      if( rc==
2d1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d1d0 20 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69       rc = setChi
2d1e0 6c 64 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64  ldPtrmaps(pChild
2d1f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d200 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2d210 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72     pChild->nOver
2d220 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  flow = 0;.      
2d230 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2d240 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2d250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2d260 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20  Cur->iPage++;.  
2d270 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31    pCur->apPage[1
2d280 5d 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 20 20  ] = pChild;.    
2d290 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
2d2a0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   0;.    rc = bal
2d2b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75  ance_nonroot(pCu
2d2c0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2d2d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2d2e0 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ild);.  }..  ret
2d2f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d300 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
2d310 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
2d320 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
2d330 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
2d340 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
2d350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
2d360 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
2d370 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
2d380 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
2d390 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
2d3a0 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
2d3b0 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
2d3c0 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
2d3d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  .** routine..** 
2d3e0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73  .** Parameter is
2d3f0 49 6e 73 65 72 74 20 69 73 20 74 72 75 65 20 69  Insert is true i
2d400 66 20 61 20 6e 65 77 20 63 65 6c 6c 20 77 61 73  f a new cell was
2d410 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 69   just inserted i
2d420 6e 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 2c  nto the.** page,
2d430 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2d440 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
2d450 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
2d460 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 69  sor *pCur, int i
2d470 73 49 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20  sInsert){.  int 
2d480 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d490 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d4a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d4b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20  pCur->iPage];.. 
2d4c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d4d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2d4e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2d4f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
2d500 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  age==0 ){.    rc
2d510 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d520 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2d530 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2d540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2d550 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2d560 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2d570 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
2d580 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Cur);.      asse
2d590 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2d5a0 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20  [0]==pPage );.  
2d5b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d5c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2d5d0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
2d5e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
2d5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d600 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  && pPage->nCell=
2d610 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2d620 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2d630 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  er(pCur);.      
2d640 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2d650 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29  Page[0]==pPage )
2d660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d670 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d680 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ==0 || rc!=SQLIT
2d690 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20  E_OK );.    }.  
2d6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2d6b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2d6c0 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21  0 || .        (!
2d6d0 69 73 49 6e 73 65 72 74 20 26 26 20 70 50 61 67  isInsert && pPag
2d6e0 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
2d6f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2d700 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
2d710 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
2d720 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  ot(pCur);.    }.
2d730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2d750 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
2d760 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
2d770 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
2d780 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
2d790 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
2d7a0 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
2d7b0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
2d7c0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
2d7d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2d7e0 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
2d7f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
2d800 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
2d810 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
2d820 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
2d830 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
2d840 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2d850 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
2d860 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
2d870 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
2d880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2d890 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2d8a0 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73  LOCKED..**.** As
2d8b0 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73   well as cursors
2d8c0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c   with wrFlag==0,
2d8d0 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72   cursors with wr
2d8e0 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20  Flag==1 and .** 
2d8f0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2d900 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e  ==1 are also con
2d910 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63  sidered 'read' c
2d920 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e  ursors. Incremen
2d930 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72  tal .** blob cur
2d940 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
2d950 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
2d960 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  nd writing..**.*
2d970 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20  * When pgnoRoot 
2d980 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
2d990 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   of an intkey ta
2d9a0 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ble, this functi
2d9b0 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  on is also.** re
2d9c0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e  sponsible for in
2d9d0 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65  validating incre
2d9e0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2d9f0 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62  ors when the tab
2da00 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69  le row.** on whi
2da10 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e  ch they are open
2da20 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ed is deleted or
2da30 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f   modified. Curso
2da40 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2da50 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20  ed.** according 
2da60 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2da70 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2da80 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65  1) When BtreeCle
2da90 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c  arTable() is cal
2daa0 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  led to completel
2dab0 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  y delete the con
2dac0 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66  tents.**      of
2dad0 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c   a B-Tree table,
2dae0 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
2daf0 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72   to zero and par
2db00 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a  ameter iRow is .
2db10 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e  **      set to n
2db20 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  on-zero. In this
2db30 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d   case all increm
2db40 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2db50 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  rs open.**      
2db60 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  on the table roo
2db70 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  ted at pgnoRoot 
2db80 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2db90 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
2dba0 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20   BtreeInsert(), 
2dbb0 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2dbc0 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20   BtreePutData() 
2dbd0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a  is called to .**
2dbe0 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74        modify a t
2dbf0 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20  able row via an 
2dc00 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70  SQL statement, p
2dc10 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2dc20 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77  o the .**      w
2dc30 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64  rite cursor used
2dc40 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66   to do the modif
2dc50 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61  ication and para
2dc60 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65  meter iRow is se
2dc70 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  t.**      to the
2dc80 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20   integer row id 
2dc90 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e  of the B-Tree en
2dca0 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  try being modifi
2dcb0 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20  ed. Unless.**   
2dcc0 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69     pExclude is i
2dcd0 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65  tself an increme
2dce0 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2dcf0 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65  , then all incre
2dd00 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62  mental.**      b
2dd10 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
2dd20 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20   on row iRow of 
2dd30 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69  the B-Tree are i
2dd40 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2dd50 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70  *   3) If both p
2dd60 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77  Exclude and iRow
2dd70 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f   are set to zero
2dd80 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  , no incremental
2dd90 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63   blob .**      c
2dda0 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
2ddb0 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
2ddc0 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2ddd0 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70  ocks(.  Btree *p
2dde0 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70  Btree, .  Pgno p
2ddf0 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75  gnoRoot, .  BtCu
2de00 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a  rsor *pExclude,.
2de10 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20    i64 iRow.){.  
2de20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
2de30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2de40 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
2de50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
2de60 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  ee->db;.  assert
2de70 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2de80 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
2de90 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2dea0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2deb0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2dec0 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
2ded0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2dee0 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
2def0 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e  gnoRoot ) contin
2df00 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
2df10 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2df20 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
2df30 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2df40 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45  ( .         (!pE
2df50 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a  xclude && iRow).
2df60 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75        || (pExclu
2df70 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d  de && !pExclude-
2df80 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2df90 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e && p->info.nKe
2dfa0 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b  y==iRow).    )){
2dfb0 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
2dfc0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2dfd0 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  D;.    }.#endif.
2dfe0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
2dff0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2e000 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e010 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
2e020 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2e030 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2e040 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72      || p->isIncr
2e050 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69  blobHandle.#endi
2e060 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  f.    ){.      s
2e070 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2e080 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  = p->pBtree->db;
2e090 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
2e0a0 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  er==0 ||.       
2e0b0 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26    (dbOther!=db &
2e0c0 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
2e0d0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
2e0e0 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20  ncommitted)==0) 
2e0f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2e100 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2e110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e120 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2e130 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e140 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2e150 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2e160 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2e170 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2e180 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2e190 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2e1a0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2e1b0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2e1c0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2e1d0 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2e1e0 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2e1f0 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2e200 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2e210 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2e220 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2e230 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2e240 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2e250 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2e260 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2e270 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2e280 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2e290 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2e2a0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2e2b0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2e2c0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2e2d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2e2e0 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2e2f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e310 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2e320 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2e330 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2e340 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2e350 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2e360 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2e370 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2e380 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2e390 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2e3a0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2e3b0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2e3c0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2e3f0 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2e400 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2e410 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e430 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2e440 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2e450 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2e460 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2e470 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69    int szNew;.  i
2e480 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
2e490 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
2e4a0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
2e4b0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
2e4c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2e4d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2e4e0 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
2e4f0 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
2e500 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
2e510 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2e520 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
2e530 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2e540 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2e550 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2e560 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2e570 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2e580 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  g an insert */. 
2e590 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2e5a0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2e5b0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2e5c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
2e5d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2e5e0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2e5f0 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43  nly );.  if( !pC
2e600 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  ur->wrFlag ){.  
2e610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e620 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f  PERM;   /* Curso
2e630 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77  r not open for w
2e640 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2e650 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2e660 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2e670 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2e680 20 70 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a   pCur, nKey) ){.
2e690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e6a0 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2e6b0 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2e6c0 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2e6d0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69   lock */.  }.  i
2e6e0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2e6f0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2e700 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
2e710 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ->skip;.  }..  /
2e720 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
2e730 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65  ions of any othe
2e740 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  r cursors open o
2e750 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  n this table */.
2e760 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
2e770 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
2e780 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49  .  if( .    SQLI
2e790 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2e7a0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2e7b0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2e7c0 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53   pCur)) ||.    S
2e7d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2e7e0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2e7f0 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
2e800 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
2e810 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20   &loc)).  ){.   
2e820 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e830 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2e840 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e850 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2e860 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
2e870 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
2e880 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2e890 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
2e8a0 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28  Key );.  TRACE((
2e8b0 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
2e8c0 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
2e8d0 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
2e8e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
2e8f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
2e900 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
2e910 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
2e920 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
2e930 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
2e940 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
2e950 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2e960 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  );.  allocateTem
2e970 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e  pSpace(pBt);.  n
2e980 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  ewCell = pBt->pT
2e990 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e  mpSpace;.  if( n
2e9a0 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2e9b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2e9c0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2e9d0 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2e9e0 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2e9f0 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
2ea00 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
2ea10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2ea20 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
2ea30 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
2ea40 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
2ea50 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
2ea60 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
2ea70 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2ea80 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2ea90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2eaa0 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
2eab0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2eac0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2ead0 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
2eae0 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
2eaf0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2eb00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2eb10 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2eb20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2eb30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
2eb40 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2eb50 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
2eb60 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2eb70 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28  e, idx);.    if(
2eb80 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2eb90 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2eba0 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2ebb0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2ebc0 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2ebd0 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2ebe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2ebf0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2ec00 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2ec10 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2ec20 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72  ert;.    rc = dr
2ec30 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
2ec40 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69  x, szOld);.    i
2ec50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ec60 20 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20   ) {.      goto 
2ec70 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
2ec80 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
2ec90 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  c<0 && pPage->nC
2eca0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ell>0 ){.    ass
2ecb0 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2ecc0 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b   );.    idx = ++
2ecd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ece0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43  ->iPage];.    pC
2ecf0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ed00 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
2ed10 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
2ed20 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2ed30 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2ed40 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65  .  }.  rc = inse
2ed50 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
2ed60 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
2ed70 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
2ed80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ed90 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
2eda0 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a  e(pCur, 1);.  }.
2edb0 0a 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20  .  /* Must make 
2edc0 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69  sure nOverflow i
2edd0 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20  s reset to zero 
2ede0 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61  even if the bala
2edf0 6e 63 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73  nce().  ** fails
2ee00 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  .  Internal data
2ee10 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
2ee20 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
2ee30 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a  t otherwise. */.
2ee40 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2ee50 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
2ee60 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 69  erflow = 0;..  i
2ee70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ee80 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
2ee90 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
2eea0 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
2eeb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2eec0 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
2eed0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2eee0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
2eef0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2ef00 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2ef10 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
2ef20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
2ef30 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
2ef40 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
2ef50 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2ef60 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2ef70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ef80 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  ];.  int idx;.  
2ef90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2efa0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cell;.  int rc;.
2efb0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2efc0 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70   = 0;.  Btree *p
2efd0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2efe0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2eff0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
2f000 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2f010 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2f020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2f030 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2f040 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2f050 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2f060 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2f070 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2f080 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2f090 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20   a delete */.   
2f0a0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2f0b0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2f0c0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2f0d0 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2f0e0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2f0f0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2f100 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  y );.  if( pCur-
2f110 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f120 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
2f130 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
2f140 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2f150 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2f160 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
2f170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2f180 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2f190 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2f1a0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2f1b0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2f1c0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2f1d0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2f1e0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2f1f0 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2f200 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2f210 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2f220 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2f230 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2f240 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2f250 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e  , pCur, pCur->in
2f260 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  fo.nKey) ){.    
2f270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2f280 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2f290 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2f2a0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2f2b0 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  k */.  }..  /* R
2f2c0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
2f2d0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2f2e0 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
2f2f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2f300 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
2f310 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2f320 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
2f330 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2f340 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2f350 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
2f360 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
2f370 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
2f380 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
2f390 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
2f3a0 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
2f3b0 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2f3c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2f3d0 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43    (rc = restoreC
2f3e0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2f3f0 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2f400 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2f410 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2f420 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21  gnoRoot, pCur))!
2f430 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
2f440 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f450 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f460 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
2f470 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2f480 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
2f490 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70  ell within its p
2f4a0 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2f4b0 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2f4c0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2f4d0 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2f4e0 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2f4f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2f500 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2f510 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2f520 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2f530 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2f540 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  /.  idx = pCur->
2f550 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2f560 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  e];.  pCell = fi
2f570 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2f580 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
2f590 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2f5a0 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2f5b0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
2f5c0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2f5d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2f5e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2f5f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2f600 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f610 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  f ){.    /*.    
2f620 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20  ** The entry we 
2f630 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c  are about to del
2f640 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
2f650 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f  f so if we do no
2f660 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65  t.    ** do some
2f670 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65  thing we will le
2f680 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e  ave a hole on an
2f690 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a   internal page..
2f6a0 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74      ** We have t
2f6b0 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20  o fill the hole 
2f6c0 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63  by moving in a c
2f6d0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e  ell from a leaf.
2f6e0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78    The.    ** nex
2f6f0 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65  t Cell after the
2f700 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74   one to be delet
2f710 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ed is guaranteed
2f720 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20   to exist and.  
2f730 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61    ** to be a lea
2f740 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  f so we can use 
2f750 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42  it..    */.    B
2f760 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b  tCursor leafCur;
2f770 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  .    MemPage *pL
2f780 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  eafPage = 0;..  
2f790 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2f7a0 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  *pNext;.    int 
2f7b0 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73  notUsed;.    uns
2f7c0 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
2f7d0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  Cell = 0;.    as
2f7e0 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e  sert( !pPage->in
2f7f0 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  tKey );.    sqli
2f800 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
2f810 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
2f820 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
2f830 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2f840 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
2f850 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
2f860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f870 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2f880 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43  fCur.aiIdx[leafC
2f890 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a  ur.iPage]==0 );.
2f8a0 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
2f8b0 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
2f8c0 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
2f8d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f8e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
2f8f0 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65  eafPage->pDbPage
2f900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f920 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66  {.      int leaf
2f930 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20  CursorInvalid = 
2f940 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  0;.      u16 szN
2f950 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
2f960 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2f970 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
2f980 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
2f990 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
2f9a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
2f9b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2f9c0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66  age->pgno, pLeaf
2f9d0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2f9e0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2f9f0 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
2fa00 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2fa10 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
2fa20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
2fa30 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  fPage, 0);.     
2fa40 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
2fa50 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c  zePtr(pLeafPage,
2fa60 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2fa70 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2fa80 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2fa90 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  +4 );.      allo
2faa0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
2fab0 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65  t);.      tempCe
2fac0 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
2fad0 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ace;.      if( t
2fae0 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2faf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2fb00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2fb10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2fb20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fb30 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
2fb40 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
2fb50 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
2fb60 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
2fb70 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
2fb80 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61   /* The "if" sta
2fb90 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65  tement in the ne
2fba0 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73  xt code block is
2fbb0 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a   critical.  The.
2fbc0 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65        ** slighte
2fbd0 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74  st error in that
2fbe0 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
2fbf0 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f   allow SQLite to
2fc00 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a   operate.      *
2fc10 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74  * correctly most
2fc20 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74   of the time but
2fc30 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61   produce very ra
2fc40 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f  re failures.  To
2fc50 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20  .      ** guard 
2fc60 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68  against this, th
2fc70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
2fc80 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66  os help to verif
2fc90 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  y that.      ** 
2fca0 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65  the "if" stateme
2fcb0 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65  nt is well teste
2fcc0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
2fcd0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2fce0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2fcf0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
2fd00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2fd10 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
2fd20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
2fd30 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2fd40 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
2fd50 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
2fd60 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2fd70 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2fd80 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
2fd90 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2fda0 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
2fdb0 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
2fdc0 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
2fdd0 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
2fde0 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
2fdf0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
2fe00 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2fe10 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
2fe20 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
2fe30 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20  e*2/3+1 .       
2fe40 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
2fe50 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
2fe60 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
2fe70 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
2fe80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2fe90 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2fea0 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  >0 && pPage->nFr
2feb0 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee<=pBt->usableS
2fec0 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20  ize*2/3.        
2fed0 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
2fee0 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
2fef0 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
2ff00 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
2ff10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
2ff20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2ff30 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
2ff40 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
2ff50 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20  eSize*2/3)).    
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2ff70 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
2ff80 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74  +2+szNext == pBt
2ff90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2ffa0 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20   );...      if( 
2ffb0 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
2ffc0 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
2ffd0 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
2ffe0 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a  leSize*2/3)) &&.
2fff0 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66            (pLeaf
30000 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
30010 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
30020 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20  leSize*2/3).    
30030 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
30040 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
30050 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65  aken if the inte
30060 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77  rnal node is now
30070 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77   either overflow
30080 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ing.        ** o
30090 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20  r underfull and 
300a0 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69  the leaf node wi
300b0 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20  ll be underfull 
300c0 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63  after the just c
300d0 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ell .        ** 
300e0 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e  copied to the in
300f0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64  ternal node is d
30100 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20  eleted from it. 
30110 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
30120 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  l.        ** cas
30130 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  e because the ca
30140 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20  ll to balance() 
30150 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69  to correct the i
30160 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20  nternal node.   
30170 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e       ** may chan
30180 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75  ge the tree stru
30190 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69  cture and invali
301a0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
301b0 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
301c0 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61  the leafCur.apPa
301d0 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72  ge[] and leafCur
301e0 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c  .aiIdx[] arrays,
301f0 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20   which will be. 
30200 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62         ** used b
30210 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  y the balance() 
30220 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72  required to corr
30230 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c  ect the underful
30240 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a  l leaf.        *
30250 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  * node..        
30260 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
30270 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69  e formula used i
30280 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
30290 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64   above are based
302a0 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20   on facets of.  
302b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
302c0 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20  ite file-format 
302d0 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
302e0 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20  ge over time..  
302f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30300 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
30310 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
30320 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29  ableSize*2/3+1 )
30330 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
30340 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e  se( pLeafPage->n
30350 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70  Free+2+szNext==p
30360 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
30370 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  /3+1 );.        
30380 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
30390 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20  d = 1;.      }  
303a0 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66        ..      if
303b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
303c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
303d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
303e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
303f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
30400 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
30410 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
30420 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e  pPage, idx), pgn
30430 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  oChild);.       
30440 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
30450 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
30460 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63   0 );.        rc
30470 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
30480 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
30490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
304a0 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72  TE_OK && leafCur
304b0 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20  sorInvalid ){.  
304c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61        /* The lea
304d0 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e  f-node is now un
304e0 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74  derfull and so t
304f0 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  he tree needs to
30500 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
30510 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65  rebalanced. Howe
30520 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65  ver, the balance
30530 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  () operation on 
30540 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20  the internal.   
30550 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f       ** node abo
30560 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69  ve may have modi
30570 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74 75  fied the structu
30580 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  re of the B-Tree
30590 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
305a0 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  so the current c
305b0 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43  ontents of leafC
305c0 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  ur.apPage[] and 
305d0 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a  leafCur.aiIdx[].
305e0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e          ** may n
305f0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20  ot be trusted.. 
30600 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
30610 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    ** It is not p
30620 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20  ossible to copy 
30630 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f  the ancestry fro
30640 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20 73  m pCur, as the s
30650 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ame.        ** b
30660 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61  alance() call ha
30670 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68  s invalidated th
30680 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d  e pCur->apPage[]
30690 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20   and aiIdx[].   
306a0 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20       ** arrays. 
306b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
306c0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20      ** The call 
306d0 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  to saveCursorPos
306e0 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e  ition() below in
306f0 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74  ternally saves t
30700 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  he .        ** k
30710 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72 20  ey that leafCur 
30720 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
30730 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e  nting to. Curren
30740 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20  tly, there.     
30750 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f     ** are two co
30760 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79  pies of that key
30770 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f   in the tree - o
30780 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  ne here on the l
30790 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eaf.        ** p
307a0 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73  age and one on s
307b0 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ome internal nod
307c0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54  e in the tree. T
307d0 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20  he copy on.     
307e0 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e     ** the leaf n
307f0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74 68  ode is always th
30800 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72  e next key in tr
30810 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74  ee-order after t
30820 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
30830 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  opy on the inter
30840 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68  nal node. So, th
30850 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
30860 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20  3BtreeNext().   
30870 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65       ** calls re
30880 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
30890 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74  ion() to point t
308a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
308b0 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a   copy.        **
308c0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69   stored on the i
308d0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68  nternal node, th
308e0 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74  en advances to t
308f0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20  he next entry,. 
30900 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20         ** which 
30910 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
30920 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65  e copy of the ke
30930 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  y on the interna
30940 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  l node..        
30950 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c  ** Net effect: l
30960 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69  eafCur is pointi
30970 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  ng back to the d
30980 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20  uplicate cell.  
30990 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65        ** that ne
309a0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eds to be remove
309b0 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43  d, and the leafC
309c0 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a  ur.apPage[] and.
309d0 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43          ** leafC
309e0 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79  ur.aiIdx[] array
309f0 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20  s are correct.. 
30a00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30a10 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f    VVA_ONLY( Pgno
30a20 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61   leafPgno = pLea
30a30 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  fPage->pgno );. 
30a40 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
30a50 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26  CursorPosition(&
30a60 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20  leafCur);.      
30a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
30aa0 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
30ab0 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
30ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
30ad0 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
30ae0 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
30af0 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20  .iPage];.       
30b00 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 50 61   assert( pLeafPa
30b10 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67  ge->pgno==leafPg
30b20 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  no );.        as
30b30 73 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69  sert( leafCur.ai
30b40 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67  Idx[leafCur.iPag
30b50 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e]==0 );.      }
30b60 0a 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ..      if( SQLI
30b70 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20  TE_OK==rc.      
30b80 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
30b90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30ba0 72 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65  rWrite(pLeafPage
30bb0 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20 20  ->pDbPage)) .   
30bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72     ){.        dr
30bd0 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65  opCell(pLeafPage
30be0 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  , 0, szNext);.  
30bf0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
30c00 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68 75  leafCur.pagesShu
30c10 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20  ffled = 0 );.   
30c20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
30c30 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a  e(&leafCur, 0);.
30c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30c50 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
30c60 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61  d || !leafCur.pa
30c70 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20  gesShuffled.    
30c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
30ca0 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68  | !pCur->pagesSh
30cb0 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  uffled );.      
30cc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
30cd0 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
30ce0 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43  empCursor(&leafC
30cf0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
30d00 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
30d10 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
30d20 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
30d30 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ",.       pCur->
30d40 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
30d50 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20  >pgno));.    rc 
30d60 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
30d70 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  , idx, cellSizeP
30d80 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
30d90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
30da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30db0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
30dc0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Cur, 0);.    }. 
30dd0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
30de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f  ITE_OK ){.    mo
30df0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
30e00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
30e20 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62   a new BTree tab
30e30 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  le.  Write into 
30e40 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67  *piTable the pag
30e50 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
30e60 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
30e70 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
30e80 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f  **.** The type o
30e90 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d  f type is determ
30ea0 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67  ined by the flag
30eb0 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e  s parameter.  On
30ec0 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ly the.** follow
30ed0 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c  ing values of fl
30ee0 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ags are currentl
30ef0 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72  y in use.  Other
30f00 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66   values for.** f
30f10 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77  lags might not w
30f20 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42  ork:.**.**     B
30f30 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45  TREE_INTKEY|BTRE
30f40 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55  E_LEAFDATA     U
30f50 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c  sed for SQL tabl
30f60 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65  es with rowid ke
30f70 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  ys.**     BTREE_
30f80 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20  ZERODATA        
30f90 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66            Used f
30fa0 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a  or SQL indices.*
30fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
30fc0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
30fd0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
30fe0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
30ff0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
31000 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
31010 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
31020 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20  Pgno pgnoRoot;. 
31030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
31040 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
31050 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
31060 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
31070 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
31080 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
31090 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
310a0 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
310b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
310c0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
310d0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
310e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
310f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
31100 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
31110 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
31120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31130 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
31140 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
31150 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
31160 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
31170 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
31180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31190 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
311a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
311b0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
311c0 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
311d0 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
311e0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
311f0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
31200 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31210 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
31220 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
31230 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
31240 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
31250 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
31260 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
31270 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
31280 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
31290 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
312a0 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
312b0 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
312c0 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
312d0 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
312e0 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
312f0 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
31300 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
31310 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
31320 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
31330 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
31340 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
31350 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
31360 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
31370 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
31380 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
31390 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
313a0 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
313b0 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
313c0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
313d0 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
313e0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
313f0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
31400 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
31410 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
31420 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
31430 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
31440 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
31450 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
31460 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
31470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31480 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31490 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
314a0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
314b0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
314c0 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
314d0 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
314e0 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
314f0 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
31500 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
31510 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e  /.    while( pgn
31520 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41  oRoot==PTRMAP_PA
31530 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f  GENO(pBt, pgnoRo
31540 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70  ot) ||.        p
31550 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47  gnoRoot==PENDING
31560 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
31570 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  ){.      pgnoRoo
31580 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t++;.    }.    a
31590 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e  ssert( pgnoRoot>
315a0 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  =3 );..    /* Al
315b0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54  locate a page. T
315c0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72  he page that cur
315d0 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61  rently resides a
315e0 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a  t pgnoRoot will.
315f0 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20      ** be moved 
31600 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
31610 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68   page (unless th
31620 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
31630 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
31640 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e  to reside at pgn
31650 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20  oRoot)..    */. 
31660 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
31670 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
31680 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
31690 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
316a0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
316b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
316c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
316d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
316e0 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
316f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f  ){.      /* pgno
31700 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65  Root is the page
31710 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
31720 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ed for the root-
31730 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  page of.      **
31740 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
31750 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f  assuming an erro
31760 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29  r did not occur)
31770 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20  . But we were.  
31780 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
31790 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65   pgnoMove. If re
317a0 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20  quired (i.e. if 
317b0 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63  it was not alloc
317c0 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ated.      ** by
317d0 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66   extending the f
317e0 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e  ile), the curren
317f0 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69  t page at positi
31800 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20  on pgnoMove.    
31810 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
31820 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20  journaled..     
31830 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79   */.      u8 eTy
31840 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
31850 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
31860 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31870 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f  eMove);..      /
31880 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
31890 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e  currently at pgn
318a0 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76  oRoot to pgnoMov
318b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
318c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
318d0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
318e0 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
318f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31920 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
31930 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
31940 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
31950 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
31960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31970 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d  TE_OK || eType==
31980 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
31990 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
319a0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
319b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
319c0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
319d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
319e0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
319f0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
31a00 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
31a10 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
31a20 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
31a30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
31a40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31a50 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
31a60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31a70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31a80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31a90 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
31aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31ab0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72    }.      rc = r
31ac0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
31ad0 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
31ae0 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
31af0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c  e, 0);.      rel
31b00 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
31b10 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  ..      /* Obtai
31b20 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67  n the page at pg
31b30 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  noRoot */.      
31b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31b50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
31b60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
31b70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31b80 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
31b90 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
31ba0 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
31bb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31bc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
31bd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
31be0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31bf0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
31c00 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
31c10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
31c40 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
31c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
31c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31c70 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f   pRoot = pPageMo
31c80 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20  ve;.    } ..    
31c90 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f  /* Update the po
31ca0 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65  inter-map and me
31cb0 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65  ta-data with the
31cc0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e   new root-page n
31cd0 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63  umber. */.    rc
31ce0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
31cf0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d  , pgnoRoot, PTRM
31d00 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b  AP_ROOTPAGE, 0);
31d10 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
31d20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31d30 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72  (pRoot);.      r
31d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
31d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31d60 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
31d70 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b  p, 4, pgnoRoot);
31d80 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
31d90 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31da0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72  (pRoot);.      r
31db0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
31dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
31dd0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
31de0 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
31df0 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
31e00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
31e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
31e20 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
31e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31e40 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
31e50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65  pDbPage) );.  ze
31e60 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c  roPage(pRoot, fl
31e70 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  ags | PTF_LEAF);
31e80 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
31e90 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50  nref(pRoot->pDbP
31ea0 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65  age);.  *piTable
31eb0 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74   = (int)pgnoRoot
31ec0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
31ed0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
31ee0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
31ef0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
31f00 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
31f10 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
31f20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
31f30 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
31f40 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
31f50 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65 61    rc = btreeCrea
31f60 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62  teTable(p, piTab
31f70 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71  le, flags);.  sq
31f80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
31f90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
31fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
31fb0 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
31fc0 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  se page and all 
31fd0 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52  its children.  R
31fe0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67  eturn.** the pag
31ff0 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
32000 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
32010 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
32020 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
32030 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
32040 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74  * The BTree that
32050 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61   contains the ta
32060 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ble */.  Pgno pg
32070 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  no,            /
32080 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
32090 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20   clear */.  int 
320a0 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20 20  freePageFlag,   
320b0 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20    /* Deallocate 
320c0 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  page if true */.
320d0 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a    int *pnChange.
320e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
320f0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
32100 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
32110 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
32120 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   i;..  assert( s
32130 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32140 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
32150 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65  .  if( pgno>page
32160 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
32170 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32180 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32190 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
321a0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
321b0 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  t, pgno, &pPage)
321c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
321d0 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
321e0 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69  age_out;.  for(i
321f0 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
32200 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  ll; i++){.    pC
32210 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
32220 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
32230 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
32240 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65  {.      rc = cle
32250 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
32260 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
32270 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65  ll), 1, pnChange
32280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32290 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
322a0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
322b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
322c0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
322d0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
322e0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
322f0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
32300 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
32310 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
32320 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
32330 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
32340 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
32350 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65  8]), 1, pnChange
32360 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
32370 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
32380 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65  sepage_out;.  }e
32390 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65  lse if( pnChange
323a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
323b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
323c0 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b  .    *pnChange +
323d0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
323e0 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61    }.  if( freePa
323f0 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  geFlag ){.    rc
32400 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
32410 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
32420 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
32430 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
32440 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20  DbPage))==0 ){. 
32450 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
32460 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
32470 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
32480 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
32490 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
324a0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
324b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
324c0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
324d0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
324e0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
324f0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
32500 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
32510 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
32520 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
32530 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
32540 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
32550 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
32560 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
32570 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
32580 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
32590 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
325a0 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
325b0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
325c0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
325d0 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
325e0 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
325f0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
32600 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
32610 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
32620 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e  ble..**.** If pn
32630 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55  Change is not NU
32640 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 69  LL, then table i
32650 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6e  Table must be an
32660 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 54   intkey table. T
32670 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61  he.** integer va
32680 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lue pointed to b
32690 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69 6e  y pnChange is in
326a0 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
326b0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e   number of.** en
326c0 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62  tries in the tab
326d0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
326e0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
326f0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
32700 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43  iTable, int *pnC
32710 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  hange){.  int rc
32720 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
32730 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
32740 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
32750 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
32760 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
32770 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
32780 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  RITE ){.    rc =
32790 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
327a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
327b0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
327c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63  .  }else if( (rc
327d0 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b   = checkReadLock
327e0 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
327f0 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  1))!=SQLITE_OK )
32800 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67  {.    /* nothing
32810 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73   to do */.  }els
32820 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21  e if( SQLITE_OK!
32830 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
32840 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c  rsors(pBt, iTabl
32850 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a  e, 0)) ){.    /*
32860 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   nothing to do *
32870 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  /.  }else{.    r
32880 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
32890 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  ePage(pBt, (Pgno
328a0 29 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e 43 68  )iTable, 0, pnCh
328b0 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ange);.  }.  sql
328c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
328d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
328e0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
328f0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
32900 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64  n a table and ad
32910 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  d the root of th
32920 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68  e table to.** th
32930 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63  e freelist.  Exc
32940 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66  ept, the root of
32950 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74   the principle t
32960 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e  able (the one on
32970 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e  .** page 1) is n
32980 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68  ever added to th
32990 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
329a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
329b0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
329c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
329d0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
329e0 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20  n.** cursors on 
329f0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
32a00 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
32a10 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68  s enabled and th
32a20 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65  e page at iTable
32a30 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
32a40 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  .** root page in
32a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32a60 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  le, then the las
32a70 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20  t root page .** 
32a80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
32a90 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e  file is moved in
32aa0 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d  to the slot form
32ab0 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
32ac0 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74  .** iTable and t
32ad0 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f  hat last slot fo
32ae0 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
32af0 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  by the last root
32b00 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65   page.** is adde
32b10 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
32b20 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61  t instead of iTa
32b30 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61  ble.  In this sa
32b40 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70  y, all.** root p
32b50 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74  ages are kept at
32b60 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
32b70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
32b80 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  ile, which.** is
32b90 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41   necessary for A
32ba0 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72  UTOVACUUM to wor
32bb0 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76  k right.  *piMov
32bc0 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ed is set to the
32bd0 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72   .** page number
32be0 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65   that used to be
32bf0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
32c00 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
32c10 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f  before.** the mo
32c20 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20  ve.  If no page 
32c30 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d  gets moved, *piM
32c40 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30  oved is set to 0
32c50 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f  ..** The last ro
32c60 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72  ot page is recor
32c70 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61  ded in meta[3] a
32c80 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  nd the value of.
32c90 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70  ** meta[3] is up
32ca0 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72  dated by this pr
32cb0 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ocedure..*/.stat
32cc0 69 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70  ic int btreeDrop
32cd0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
32ce0 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 69 6e 74  Pgno iTable, int
32cf0 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
32d00 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
32d10 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74  *pPage = 0;.  Bt
32d20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
32d30 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
32d40 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
32d50 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
32d60 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
32d70 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
32d80 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
32d90 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
32da0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
32db0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
32dc0 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
32dd0 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  l to drop a tabl
32de0 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
32df0 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
32e00 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
32e10 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
32e20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
32e30 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20  ode the backend 
32e40 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f  may.  ** need to
32e50 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f   move another ro
32e60 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20  ot-page to fill 
32e70 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  a gap left by th
32e80 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72  e deleted.  ** r
32e90 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20  oot page. If an 
32ea0 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20  open cursor was 
32eb0 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  using this page 
32ec0 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20  a problem would 
32ed0 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a  .  ** occur..  *
32ee0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75  /.  if( pBt->pCu
32ef0 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
32f00 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
32f10 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
32f20 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
32f30 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
32f40 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  ble, &pPage, 0);
32f50 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
32f60 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
32f70 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
32f80 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20  able(p, iTable, 
32f90 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
32fa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32fb0 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
32fc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rn rc;.  }..  *p
32fd0 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69  iMoved = 0;..  i
32fe0 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23  f( iTable>1 ){.#
32ff0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
33000 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33010 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
33020 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Page);.    relea
33030 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23  sePage(pPage);.#
33040 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74  else.    if( pBt
33050 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
33060 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f        Pgno maxRo
33070 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63  otPgno;.      rc
33080 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
33090 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61  etMeta(p, 4, &ma
330a0 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
330b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
330c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
330d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
330e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
330f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
33100 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
33110 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
33120 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
33130 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
33140 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
33150 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
33160 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
33170 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
33180 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
33190 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
331a0 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
331b0 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
331c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
331d0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
331e0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
331f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
33200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
33230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33240 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
33250 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
33260 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
33270 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
33280 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
33290 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
332a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
332b0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
332c0 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
332d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
332e0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
332f0 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
33300 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
33310 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
33320 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
33330 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
33340 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
33350 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
33360 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
33370 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
33380 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
333a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
333b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
333c0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
333d0 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
333e0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
333f0 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b  , 0, iTable, 0);
33400 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
33410 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
33420 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33440 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
33470 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
33480 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
33490 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
334a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
334b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
334c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
334d0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
334e0 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
334f0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
33500 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
33510 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33550 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
33560 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
33570 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
33580 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
33590 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
335a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
335b0 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
335c0 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
335d0 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
335e0 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
335f0 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
33600 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
33610 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
33620 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
33630 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
33640 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
33650 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
33660 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
33670 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
33680 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
33690 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
336a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
336b0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
336c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
336d0 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
336e0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
336f0 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
33700 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
33710 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
33720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
33730 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
33740 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33750 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
33760 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
33770 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
33780 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
33790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
337a0 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
337b0 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
337c0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
337d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
337e0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
337f0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
33800 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
33810 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
33820 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
33830 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
33840 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
33850 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
33860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33870 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
33880 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
33890 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
338a0 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
338b0 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
338c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
338d0 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
338e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
338f0 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c   = btreeDropTabl
33900 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d  e(p, iTable, piM
33910 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  oved);.  sqlite3
33920 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
33930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
33940 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d  /*.** Read the m
33950 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
33960 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  out of a databas
33970 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d  e file.  Meta[0]
33980 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65  .** is the numbe
33990 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
339a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
339b0 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
339c0 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d  [1].** through m
339d0 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69  eta[15] are avai
339e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79  lable for use by
339f0 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20   higher layers. 
33a00 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72   Meta[0].** is r
33a10 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74  ead-only, the ot
33a20 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72  hers are read/wr
33a30 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ite..** .** The 
33a40 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d  schema layer num
33a50 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73  bers meta values
33a60 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41   differently.  A
33a70 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20  t the schema.** 
33a80 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53  layer (and the S
33a90 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61  etCookie and Rea
33aa0 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29  dCookie opcodes)
33ab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
33ac0 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20  * free pages is 
33ad0 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f  not visible.  So
33ae0 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68   Cookie[0] is th
33af0 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31  e same as Meta[1
33b00 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ]..*/.int sqlite
33b10 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74  3BtreeGetMeta(Bt
33b20 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
33b30 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20   u32 *pMeta){.  
33b40 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
33b50 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
33b60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33b70 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pP1;.  BtShared 
33b80 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
33b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
33ba0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
33bb0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
33bc0 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
33bd0 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
33be0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
33bf0 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
33c00 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
33c10 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
33c20 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
33c30 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
33c40 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
33c50 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
33c60 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
33c70 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
33c80 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
33c90 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
33ca0 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
33cb0 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
33cc0 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
33cd0 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
33ce0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
33cf0 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
33d00 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
33d10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33d20 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
33d30 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
33d40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33d50 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
33d60 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
33d70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  );.  if( pBt->pP
33d80 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  age1 ){.    /* T
33d90 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c 72  he b-tree is alr
33da0 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20 72  eady holding a r
33db0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
33dc0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
33dd0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  se.    ** file. 
33de0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33df0 20 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d 64   required meta-d
33e00 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62 65  ata value can be
33e10 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a 20   read directly. 
33e20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
33e30 61 67 65 20 64 61 74 61 20 6f 66 20 74 68 69 73  age data of this
33e40 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
33e50 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
33e60 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ter than.    ** 
33e70 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65 77  requesting a new
33e80 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20   reference from 
33e90 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e  the pager layer.
33ea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31 20  .    */.    pP1 
33eb0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
33ec0 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   *)pBt->pPage1->
33ed0 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a  aData;.  }else{.
33ee0 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65      /* The b-tre
33ef0 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
33f00 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
33f10 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
33f20 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
33f30 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72  ** Obtain one fr
33f40 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
33f50 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  er..    */.    r
33f60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33f70 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
33f80 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   1, &pDbPage);. 
33f90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33fa0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
33fb0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
33fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
33fd0 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67      pP1 = (unsig
33fe0 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
33ff0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
34000 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a  DbPage);.  }.  *
34010 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
34020 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
34030 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ]);..  /* If the
34040 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20 68   b-tree is not h
34050 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
34060 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74 68  ce to page 1, th
34070 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a  en one was .  **
34080 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
34090 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
340a0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f  in the above blo
340b0 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20 6e  ck. Release it n
340c0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
340d0 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20  pBt->pPage1 ){. 
340e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
340f0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
34100 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f   }..  /* If auto
34110 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61  vacuumed is disa
34120 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
34130 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72  ld but we are tr
34140 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63  ying to .  ** ac
34150 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75  cess an autovacu
34160 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  umed database, t
34170 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74  hen make the dat
34180 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20  abase readonly. 
34190 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
341a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
341b0 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34  UUM.  if( idx==4
341c0 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70   && *pMeta>0 ) p
341d0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
341e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  ;.#endif..  /* G
341f0 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  rab the read-loc
34200 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  k on page 1. */.
34210 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
34220 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
34230 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
34240 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
34250 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34260 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f   Write meta-info
34270 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74  rmation back int
34280 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
34290 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72   Meta[0] is.** r
342a0 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79  ead-only and may
342b0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e   not be written.
342c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
342d0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42  treeUpdateMeta(B
342e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
342f0 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20  , u32 iMeta){.  
34300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34310 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
34320 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20  ed char *pP1;.  
34330 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
34340 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c  ( idx>=1 && idx<
34350 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  =15 );.  sqlite3
34360 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
34370 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
34380 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
34390 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
343a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
343b0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
343c0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
343d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
343e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
343f0 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
34400 29 3b 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74  );.    pP1 = pBt
34410 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
34420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34430 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
34440 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
34450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
34460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34470 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b    put4byte(&pP1[
34480 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65  36 + idx*4], iMe
34490 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ta);.#ifndef SQL
344a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
344b0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64  UUM.      if( id
344c0 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  x==7 ){.        
344d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
344e0 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61  oVacuum || iMeta
344f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
34500 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20  ssert( iMeta==0 
34510 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20  || iMeta==1 );. 
34520 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
34530 56 61 63 75 75 6d 20 3d 20 28 75 38 29 69 4d 65  Vacuum = (u8)iMe
34540 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ta;.      }.#end
34550 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  if.    }.  }.  s
34560 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34570 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
34580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34590 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20  n the flag byte 
345a0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
345b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
345c0 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
345d0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
345e0 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
345f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
34600 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
34610 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
34620 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52  hat about CURSOR
34630 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
34640 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65  te? Probably nee
34650 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72  d to call.  ** r
34660 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
34670 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a  tion() here..  *
34680 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
34690 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75 72  ge;.  restoreCur
346a0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
346b0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
346c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
346d0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
346e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
346f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
34700 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
34710 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20  ==pCur->pBt );. 
34720 20 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20   return pPage ? 
34730 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
34740 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a  ge->hdrOffset] :
34750 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   0;.}.../*.** Re
34760 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61  turn the pager a
34770 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
34780 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f   BTree.  This ro
34790 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
347a0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
347b0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
347c0 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74  .*/.Pager *sqlit
347d0 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72  e3BtreePager(Btr
347e0 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
347f0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b   p->pBt->pPager;
34800 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
34810 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
34820 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70  Y_CHECK./*.** Ap
34830 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74  pend a message t
34840 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
34850 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  age string..*/.s
34860 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
34870 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74  AppendMsg(.  Int
34880 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
34890 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c  ,.  char *zMsg1,
348a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
348b0 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b  Format,.  ....){
348c0 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
348d0 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78   if( !pCheck->mx
348e0 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
348f0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b  pCheck->mxErr--;
34900 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b  .  pCheck->nErr+
34910 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  +;.  va_start(ap
34920 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66  , zFormat);.  if
34930 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  ( pCheck->errMsg
34940 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 73 71  .nChar ){.    sq
34950 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
34960 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  end(&pCheck->err
34970 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20  Msg, "\n", 1);. 
34980 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67 31 20 29   }.  if( zMsg1 )
34990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  {.    sqlite3Str
349a0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68  AccumAppend(&pCh
349b0 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d 73  eck->errMsg, zMs
349c0 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 73  g1, -1);.  }.  s
349d0 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 28 26  qlite3VXPrintf(&
349e0 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20  pCheck->errMsg, 
349f0 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  1, zFormat, ap);
34a00 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
34a10 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72   if( pCheck->err
34a20 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  Msg.mallocFailed
34a30 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e   ){.    pCheck->
34a40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
34a50 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
34a60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
34a70 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
34a80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
34a90 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
34aa0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CHECK./*.** Add 
34ab0 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  1 to the referen
34ac0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
34ad0 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68 69  e iPage.  If thi
34ae0 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  s is the second.
34af0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
34b00 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e  the page, add an
34b10 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
34b20 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  o pCheck->zErrMs
34b30 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  g..** Return 1 i
34b40 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f 72  f there are 2 or
34b50 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65  e more reference
34b60 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  s to the page an
34b70 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69  d 0 if.** if thi
34b80 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  s is the first r
34b90 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
34ba0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  page..**.** Also
34bb0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
34bc0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69  page number is i
34bd0 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61  n bounds..*/.sta
34be0 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66  tic int checkRef
34bf0 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43  (IntegrityCk *pC
34c00 68 65 63 6b 2c 20 50 67 6e 6f 20 69 50 61 67 65  heck, Pgno iPage
34c10 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
34c20 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
34c30 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
34c40 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
34c50 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 63  ->nPage ){.    c
34c60 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34c70 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
34c80 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75  "invalid page nu
34c90 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29  mber %d", iPage)
34ca0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
34cb0 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b    }.  if( pCheck
34cc0 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d  ->anRef[iPage]==
34cd0 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  1 ){.    checkAp
34ce0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
34cf0 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72  zContext, "2nd r
34d00 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
34d10 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
34d20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
34d30 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
34d40 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
34d50 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  +)>1;.}..#ifndef
34d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34d70 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68  OVACUUM./*.** Ch
34d80 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74  eck that the ent
34d90 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
34da0 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69  r-map for page i
34db0 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a  Child maps to .*
34dc0 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20  * page iParent, 
34dd0 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72  pointer type ptr
34de0 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70  Type. If not, ap
34df0 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65  pend an error me
34e00 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65  ssage.** to pChe
34e10 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
34e20 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a  id checkPtrmap(.
34e30 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
34e40 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65  Check,   /* Inte
34e50 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74  grity check cont
34e60 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ext */.  Pgno iC
34e70 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  hild,           
34e80 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75  /* Child page nu
34e90 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79  mber */.  u8 eTy
34ea0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
34eb0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
34ec0 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f  nter map type */
34ed0 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c  .  Pgno iParent,
34ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
34ef0 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
34f00 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  p parent page nu
34f10 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
34f20 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
34f30 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63   /* Context desc
34f40 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f  ription (used fo
34f50 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a  r error msg) */.
34f60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
34f70 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20  8 ePtrmapType;. 
34f80 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72   Pgno iPtrmapPar
34f90 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72  ent;..  rc = ptr
34fa0 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  mapGet(pCheck->p
34fb0 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74  Bt, iChild, &ePt
34fc0 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d  rmapType, &iPtrm
34fd0 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  apParent);.  if(
34fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34ff0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
35000 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 70 43 68  LITE_NOMEM ) pCh
35010 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  eck->mallocFaile
35020 64 20 3d 20 31 3b 0a 20 20 20 20 63 68 65 63 6b  d = 1;.    check
35030 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
35040 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69  , zContext, "Fai
35050 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d  led to read ptrm
35060 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69  ap key=%d", iChi
35070 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ld);.    return;
35080 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72  .  }..  if( ePtr
35090 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c  mapType!=eType |
350a0 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21  | iPtrmapParent!
350b0 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  =iParent ){.    
350c0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
350d0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
350e0 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72   .      "Bad ptr
350f0 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25   map entry key=%
35100 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25  d expected=(%d,%
35110 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c  d) got=(%d,%d)",
35120 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20   .      iChild, 
35130 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20  eType, iParent, 
35140 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74  ePtrmapType, iPt
35150 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  rmapParent);.  }
35160 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
35170 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
35180 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
35190 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76  list or of an ov
351a0 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
351b0 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  ..** Verify that
351c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
351d0 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  ages on the list
351e0 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   is N..*/.static
351f0 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28   void checkList(
35200 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
35210 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65  pCheck,  /* Inte
35220 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63  grity checking c
35230 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
35240 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20  isFreeList,     
35250 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
35260 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65  freelist.  False
35270 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61   for overflow pa
35280 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ge list */.  int
35290 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
352a0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
352b0 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65  r for first page
352c0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
352d0 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
352e0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
352f0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ted number of pa
35300 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
35310 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
35320 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ext        /* Co
35330 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
35340 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  messages */.){. 
35350 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78   int i;.  int ex
35360 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e  pected = N;.  in
35370 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65  t iFirst = iPage
35380 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e  ;.  while( N-- >
35390 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78   0 && pCheck->mx
353a0 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67  Err ){.    DbPag
353b0 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20  e *pOvflPage;.  
353c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
353d0 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20  *pOvflData;.    
353e0 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20  if( iPage<1 ){. 
353f0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
35400 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
35410 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22  text,.         "
35420 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d  %d of %d pages m
35430 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72  issing from over
35440 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69  flow list starti
35450 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20  ng at %d",.     
35460 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74       N+1, expect
35470 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  ed, iFirst);.   
35480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35490 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66      if( checkRef
354a0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
354b0 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61  zContext) ) brea
354c0 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
354d0 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63  e3PagerGet(pChec
354e0 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f  k->pPager, (Pgno
354f0 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61  )iPage, &pOvflPa
35500 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ge) ){.      che
35510 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
35520 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66  ck, zContext, "f
35530 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67  ailed to get pag
35540 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
35550 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35560 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20  }.    pOvflData 
35570 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
35580 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
35590 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65  etData(pOvflPage
355a0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65  );.    if( isFre
355b0 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  eList ){.      i
355c0 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  nt n = get4byte(
355d0 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a  &pOvflData[4]);.
355e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
355f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35600 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
35610 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
35620 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
35630 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
35640 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
35650 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
35660 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ext);.      }.#e
35670 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e  ndif.      if( n
35680 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73  >pCheck->pBt->us
35690 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a  ableSize/4-2 ){.
356a0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
356b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
356c0 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
356d0 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65      "freelist le
356e0 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67  af count too big
356f0 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50   on page %d", iP
35700 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d  age);.        N-
35710 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
35720 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
35730 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
35740 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
35750 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
35760 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34  &pOvflData[8+i*4
35770 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
35780 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
35790 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  UM.          if(
357a0 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
357b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
357c0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
357d0 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65  map(pCheck, iFre
357e0 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  ePage, PTRMAP_FR
357f0 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74  EEPAGE, 0, zCont
35800 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
35810 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
35820 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65     checkRef(pChe
35830 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a  ck, iFreePage, z
35840 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
35850 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d    }.        N -=
35860 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
35870 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
35880 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
35890 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
358a0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
358b0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
358c0 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50  to-vacuum and iP
358d0 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  age is not the l
358e0 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ast.      ** pag
358f0 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c  e in this overfl
35900 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74  ow list, check t
35910 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hat the pointer-
35920 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
35930 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
35940 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65  wing page matche
35950 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a  s iPage..      *
35960 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  /.      if( pChe
35970 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
35980 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  uum && N>0 ){.  
35990 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79        i = get4by
359a0 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
359b0 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
359c0 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54  ap(pCheck, i, PT
359d0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
359e0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
359f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35a00 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65  #endif.    iPage
35a10 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
35a20 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  lData);.    sqli
35a30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
35a40 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  vflPage);.  }.}.
35a50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
35a60 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
35a70 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
35a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
35a90 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
35aa0 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73  .** Do various s
35ab0 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  anity checks on 
35ac0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66  a single page of
35ad0 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e   a tree.  Return
35ae0 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70  .** the tree dep
35af0 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20  th.  Root pages 
35b00 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e  return 0.  Paren
35b10 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ts of root pages
35b20 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e  .** return 1, an
35b30 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a  d so forth..** .
35b40 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20  ** These checks 
35b50 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  are done:.**.** 
35b60 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75       1.  Make su
35b70 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e  re that cells an
35b80 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20  d freeblocks do 
35b90 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20  not overlap.**  
35ba0 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62          but comb
35bb0 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ine to completel
35bc0 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65  y cover the page
35bd0 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61  ..**  NO  2.  Ma
35be0 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79  ke sure cell key
35bf0 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a  s are in order..
35c00 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65  **  NO  3.  Make
35c10 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
35c20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
35c30 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e  al to zLowerBoun
35c40 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d  d..**  NO  4.  M
35c50 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
35c60 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
35c70 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70  or equal to zUpp
35c80 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20  erBound..**     
35c90 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69   5.  Check the i
35ca0 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72  ntegrity of over
35cb0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20  flow pages..**  
35cc0 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76      6.  Recursiv
35cd0 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72  ely call checkTr
35ce0 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68  eePage on all ch
35cf0 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20  ildren..**      
35d00 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  7.  Verify that 
35d10 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c  the depth of all
35d20 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65   children is the
35d30 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38   same..**      8
35d40 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .  Make sure thi
35d50 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61  s page is at lea
35d60 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65  st 33% full or e
35d70 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  lse it is.**    
35d80 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f        the root o
35d90 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73  f the tree..*/.s
35da0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54  tatic int checkT
35db0 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67  reePage(.  Integ
35dc0 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
35dd0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
35de0 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  the sanity check
35df0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
35e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
35e10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
35e20 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20  e page to check 
35e30 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65  */.  char *zPare
35e40 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61  ntContext  /* Pa
35e50 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rent context */.
35e60 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
35e70 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63  age;.  int i, rc
35e80 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e  , depth, d2, pgn
35e90 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64  o, cnt;.  int hd
35ea0 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20  r, cellStart;.  
35eb0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  int nCell;.  u8 
35ec0 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  *data;.  BtShare
35ed0 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73  d *pBt;.  int us
35ee0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72  ableSize;.  char
35ef0 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a   zContext[100];.
35f00 20 20 63 68 61 72 20 2a 68 69 74 20 3d 20 30 3b    char *hit = 0;
35f10 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
35f20 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
35f30 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
35f40 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50   "Page %d: ", iP
35f50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  age);..  /* Chec
35f60 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
35f70 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42  exists.  */.  pB
35f80 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b  t = pCheck->pBt;
35f90 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
35fa0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
35fb0 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20  .  if( iPage==0 
35fc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
35fd0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
35fe0 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e  k, iPage, zParen
35ff0 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75  tContext) ) retu
36000 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20  rn 0;.  if( (rc 
36010 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
36020 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
36030 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20  )iPage, &pPage, 
36040 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  0))!=0 ){.    if
36050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
36060 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c  EM ) pCheck->mal
36070 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
36080 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
36090 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
360a0 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62  xt,.       "unab
360b0 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  le to get the pa
360c0 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  ge. error code=%
360d0 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74  d", rc);.    ret
360e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
360f0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
36100 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
36110 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  e))!=0 ){.    if
36120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
36130 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c  EM ) pCheck->mal
36140 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
36150 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
36160 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
36170 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
36180 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
36190 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
361a0 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f  returns error co
361b0 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de %d", rc);.   
361c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
361d0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
361e0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
361f0 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63  ck out all the c
36200 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70  ells..  */.  dep
36210 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  th = 0;.  for(i=
36220 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
36230 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  l && pCheck->mxE
36240 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  rr; i++){.    u8
36250 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 75 33 32   *pCell;.    u32
36260 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66   sz;.    CellInf
36270 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20  o info;..    /* 
36280 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76  Check payload ov
36290 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
362a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
362b0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
362c0 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
362d0 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
362e0 20 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20    "On tree page 
362f0 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69  %d cell %d: ", i
36300 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43  Page, i);.    pC
36310 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
36320 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c  Page,i);.    sql
36330 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
36340 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
36350 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
36360 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b  sz = info.nData;
36370 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
36380 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20  >intKey ) sz += 
36390 28 69 6e 74 29 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  (int)info.nKey;.
363a0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d      assert( sz==
363b0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
363c0 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f  .    if( sz>info
363d0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
363e0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a   int nPage = (sz
363f0 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
36400 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29   usableSize - 5)
36410 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  /(usableSize - 4
36420 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  );.      Pgno pg
36430 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
36440 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
36450 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64  verflow]);.#ifnd
36460 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
36470 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
36480 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
36490 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
364a0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
364b0 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  k, pgnoOvfl, PTR
364c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69  MAP_OVERFLOW1, i
364d0 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
364e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
364f0 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28        checkList(
36500 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f  pCheck, 0, pgnoO
36510 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e  vfl, nPage, zCon
36520 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
36530 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74    /* Check sanit
36540 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20  y of left child 
36550 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
36560 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
36570 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20  f ){.      pgno 
36580 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
36590 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
365a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
365b0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
365c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
365d0 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
365e0 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ap(pCheck, pgno,
365f0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69   PTRMAP_BTREE, i
36600 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
36610 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
36620 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b        d2 = check
36630 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c  TreePage(pCheck,
36640 20 70 67 6e 6f 2c 20 7a 43 6f 6e 74 65 78 74 29   pgno, zContext)
36650 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  ;.      if( i>0 
36660 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a  && d2!=depth ){.
36670 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
36680 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
36690 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20  Context, "Child 
366a0 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65  page depth diffe
366b0 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs");.      }.  
366c0 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a      depth = d2;.
366d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
366e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
366f0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
36700 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
36710 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
36720 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69  et+8]);.    sqli
36730 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36740 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
36750 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
36760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36770 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69  On page %d at ri
36780 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50  ght child: ", iP
36790 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
367a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
367b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
367c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
367d0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
367e0 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
367f0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
36800 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  age, 0);.    }.#
36810 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
36820 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20  reePage(pCheck, 
36830 70 67 6e 6f 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  pgno, zContext);
36840 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63  .  }. .  /* Chec
36850 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63  k for complete c
36860 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70  overage of the p
36870 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20  age.  */.  data 
36880 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
36890 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
368a0 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20  drOffset;.  hit 
368b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
368c0 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
368d0 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 3d  ze );.  if( hit=
368e0 3d 30 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b  =0 ){.    pCheck
368f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
36900 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
36910 20 75 31 36 20 63 6f 6e 74 65 6e 74 4f 66 66 73   u16 contentOffs
36920 65 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  et = get2byte(&d
36930 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
36940 20 69 66 20 28 63 6f 6e 74 65 6e 74 4f 66 66 73   if (contentOffs
36950 65 74 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 29  et > usableSize)
36960 20 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70   {.      checkAp
36970 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
36980 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
36990 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
369a0 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
369b0 20 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20   header on page 
369c0 25 64 22 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  %d",iPage,0);.  
369d0 20 20 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 70      goto check_p
369e0 61 67 65 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d  age_abort;.    }
369f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2b  .    memset(hit+
36a00 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 2c 20 30  contentOffset, 0
36a10 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 6f 6e  , usableSize-con
36a20 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20  tentOffset);.   
36a30 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20   memset(hit, 1, 
36a40 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a  contentOffset);.
36a50 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
36a60 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
36a70 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
36a80 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
36a90 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
36aa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
36ab0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
36ac0 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
36ad0 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
36ae0 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75  t+i*2]);.      u
36af0 31 36 20 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  16 size = 1024;.
36b00 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
36b10 20 20 20 69 66 28 20 70 63 3c 3d 75 73 61 62 6c     if( pc<=usabl
36b20 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
36b30 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
36b40 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
36b50 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [pc]);.      }. 
36b60 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
36b70 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
36b80 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
36b90 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
36ba0 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
36bb0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
36bc0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
36bd0 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
36be0 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
36bf0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
36c00 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
36c10 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
36c20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
36c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
36c40 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
36c50 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
36c60 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
36c70 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
36c80 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
36c90 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
36ca0 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
36cb0 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
36cc0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
36cd0 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
36ce0 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
36cf0 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
36d00 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
36d10 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
36d20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
36d30 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
36d40 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
36d50 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
36d60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
36d70 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
36d80 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
36d90 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
36da0 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
36db0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
36dc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
36dd0 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
36de0 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
36df0 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
36e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
36e10 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
36e20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
36e30 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
36e40 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
36e50 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
36e60 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
36e70 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
36e80 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
36e90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36ea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36eb0 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
36ec0 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
36ed0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
36ee0 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
36ef0 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
36f00 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
36f10 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
36f20 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
36f30 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
36f40 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
36f50 20 20 20 20 7d 0a 20 20 7d 0a 63 68 65 63 6b 5f      }.  }.check_
36f60 70 61 67 65 5f 61 62 6f 72 74 3a 0a 20 20 69 66  page_abort:.  if
36f70 20 28 68 69 74 29 20 73 71 6c 69 74 65 33 50 61   (hit) sqlite3Pa
36f80 67 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  geFree(hit);..  
36f90 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
36fa0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
36fb0 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
36fc0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
36fd0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
36fe0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36ff0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
37000 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
37010 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
37020 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
37030 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
37040 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
37050 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
37060 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
37070 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
37080 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
37090 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
370a0 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
370b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
370c0 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
370d0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
370e0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
370f0 20 73 65 65 6e 20 69 6e 20 2a 70 6e 45 72 72 2e   seen in *pnErr.
37100 20 20 45 78 63 65 70 74 20 66 6f 72 20 73 6f 6d    Except for som
37110 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  e memory.** allo
37120 63 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 20 20  cation errors,  
37130 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
37140 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
37150 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
37160 20 6d 61 6c 6c 6f 63 20 69 73 20 72 65 74 75 72   malloc is retur
37170 6e 65 64 20 69 66 20 2a 70 6e 45 72 72 20 69 73  ned if *pnErr is
37180 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 2a   non-zero.  If *
37190 70 6e 45 72 72 3d 3d 30 20 74 68 65 6e 20 4e 55  pnErr==0 then NU
371a0 4c 4c 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  LL is.** returne
371b0 64 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  d.  If a memory 
371c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
371d0 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
371e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
371f0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
37200 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
37210 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
37220 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
37230 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
37240 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
37250 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
37260 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
37270 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
37280 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
37290 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
372a0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
372b0 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
372c0 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
372d0 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
372e0 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
372f0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
37300 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
37310 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
37320 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
37330 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50  riable */.){.  P
37340 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  gno i;.  int nRe
37350 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
37360 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61   sCheck;.  BtSha
37370 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
37380 74 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31  t;.  char zErr[1
37390 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  00];..  sqlite3B
373a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
373b0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
373c0 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  .  nRef = sqlite
373d0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
373e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
373f0 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  f( lockBtreeWith
37400 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45  Retry(p)!=SQLITE
37410 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72  _OK ){.    *pnEr
37420 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  r = 1;.    sqlit
37430 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
37440 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
37450 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 22  te3DbStrDup(0, "
37460 63 61 6e 6e 6f 74 20 61 63 71 75 69 72 65 20 61  cannot acquire a
37470 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
37480 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
37490 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d  }.  sCheck.pBt =
374a0 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70   pBt;.  sCheck.p
374b0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
374c0 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50  ger;.  sCheck.nP
374d0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
374e0 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 42 74 29  ount(sCheck.pBt)
374f0 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
37500 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
37510 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73  ck.nErr = 0;.  s
37520 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c  Check.mallocFail
37530 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72  ed = 0;.  *pnErr
37540 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
37550 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37560 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
37570 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
37580 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
37590 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d  pBt->nTrunc;.  }
375a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43  .#endif.  if( sC
375b0 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
375c0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
375d0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
375e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
375f0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
37600 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
37610 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
37620 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65  te3Malloc( (sChe
37630 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
37640 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
37650 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43  0]) );.  if( !sC
37660 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20  heck.anRef ){.  
37670 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
37680 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
37690 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20  *pnErr = 1;.    
376a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
376b0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
376c0 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
376d0 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  0; i<=sCheck.nPa
376e0 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b  ge; i++){ sCheck
376f0 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d  .anRef[i] = 0; }
37700 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42  .  i = PENDING_B
37710 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20  YTE_PAGE(pBt);. 
37720 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e   if( i<=sCheck.n
37730 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65  Page ){.    sChe
37740 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b  ck.anRef[i] = 1;
37750 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
37760 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43 68 65  rAccumInit(&sChe
37770 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72 2c  ck.errMsg, zErr,
37780 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 32   sizeof(zErr), 2
37790 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  0000);..  /* Che
377a0 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
377b0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
377c0 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73  .  */.  checkLis
377d0 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65  t(&sCheck, 1, ge
377e0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
377f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
37800 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
37810 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
37820 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20  e1->aData[36]), 
37830 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20  "Main freelist: 
37840 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ");..  /* Check 
37850 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a  all the tables..
37860 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
37870 28 69 6e 74 29 69 3c 6e 52 6f 6f 74 20 26 26 20  (int)i<nRoot && 
37880 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
37890 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f  +){.    if( aRoo
378a0 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  t[i]==0 ) contin
378b0 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
378c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
378d0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
378e0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52  autoVacuum && aR
378f0 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  oot[i]>1 ){.    
37900 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73    checkPtrmap(&s
37910 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
37920 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
37930 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
37940 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
37950 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c  reePage(&sCheck,
37960 20 61 52 6f 6f 74 5b 69 5d 2c 20 22 4c 69 73 74   aRoot[i], "List
37970 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20   of tree roots: 
37980 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ");.  }..  /* Ma
37990 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61  ke sure every pa
379a0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  ge in the file i
379b0 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a  s referenced.  *
379c0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  /.  for(i=1; i<=
379d0 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20  sCheck.nPage && 
379e0 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
379f0 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
37a00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37a10 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  M.    if( sCheck
37a20 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a  .anRef[i]==0 ){.
37a30 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
37a40 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
37a50 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
37a60 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
37a70 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
37a80 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
37a90 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
37aa0 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65  acuum, make sure
37ab0 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61   no tables conta
37ac0 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  in.    ** refere
37ad0 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d  nces to pointer-
37ae0 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a  map pages..    *
37af0 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  /.    if( sCheck
37b00 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20  .anRef[i]==0 && 
37b10 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
37b20 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d  PAGENO(pBt, i)!=
37b30 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56  i || !pBt->autoV
37b40 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
37b50 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
37b60 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
37b70 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
37b80 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  d", i);.    }.  
37b90 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
37ba0 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20  ef[i]!=0 && .   
37bb0 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
37bc0 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26  NO(pBt, i)==i &&
37bd0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
37be0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
37bf0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
37c00 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d  k, 0, "Pointer m
37c10 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65  ap page %d is re
37c20 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20  ferenced", i);. 
37c30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
37c40 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
37c50 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69  this analysis di
37c60 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20  d not leave any 
37c70 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20  unref() pages.  
37c80 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  */.  unlockBtree
37c90 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
37ca0 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c   if( nRef != sql
37cb0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
37cc0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
37cd0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
37ce0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
37cf0 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e   .      "Outstan
37d00 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20  ding page count 
37d10 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  goes from %d to 
37d20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61  %d during this a
37d30 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20  nalysis",.      
37d40 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67  nRef, sqlite3Pag
37d50 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
37d60 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
37d70 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
37d80 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
37d90 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
37da0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
37db0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
37dc0 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
37dd0 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61  .  if( sCheck.ma
37de0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
37df0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
37e00 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65  mReset(&sCheck.e
37e10 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45  rrMsg);.    *pnE
37e20 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
37e30 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
37e40 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d  ;.  }.  *pnErr =
37e50 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20   sCheck.nErr;.  
37e60 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d  if( sCheck.nErr=
37e70 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  =0 ) sqlite3StrA
37e80 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63  ccumReset(&sChec
37e90 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74  k.errMsg);.  ret
37ea0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
37eb0 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63  cumFinish(&sChec
37ec0 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e  k.errMsg);.}.#en
37ed0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37ee0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
37ef0 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
37f00 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
37f10 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
37f20 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
37f30 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
37f40 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20   pager filename 
37f50 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
37f60 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
37f70 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
37f80 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
37f90 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
37fa0 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
37fb0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
37fc0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
37fd0 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
37fe0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
37ff0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
38000 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
38010 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
38020 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
38030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
38040 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
38050 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
38060 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
38070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
38080 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
38090 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69  directory name i
380a0 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
380b0 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
380c0 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
380d0 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
380e0 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
380f0 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
38100 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
38110 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69  qlite3BtreeGetDi
38120 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  rname(Btree *p){
38130 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
38140 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
38150 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
38160 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e  PagerDirname(p->
38170 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
38180 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38190 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
381a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
381b0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
381c0 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  . The return.** 
381d0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f  value of this ro
381e0 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
381f0 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
38200 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72  whether the jour
38210 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
38220 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20  been created or 
38230 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  not..**.** The p
38240 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ager journal fil
38250 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
38260 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
38270 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
38280 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
38290 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
382a0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
382b0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
382c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
382d0 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
382e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
382f0 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
38300 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
38310 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
38320 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70  Journalname(p->p
38330 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
38340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
38350 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
38360 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65   Copy the comple
38370 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42  te content of pB
38380 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f  tFrom into pBtTo
38390 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
383a0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69  .** must be acti
383b0 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65  ve for both file
383c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
383d0 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61  e of file pTo ma
383e0 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
383f0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
38400 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
3841