/ Hex Artifact Content
Login

Artifact cda41ffc78e53cd29e53eab47d174d3e6afd680d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 38 32 20 32 30 30 38 2f 30  c,v 1.482 2008/0
0190: 37 2f 31 32 20 31 34 3a 35 32 3a 32 30 20 64 72  7/12 14:52:20 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 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69 6e  .** A flag to in
0450: 64 69 63 61 74 65 20 77 68 65 74 68 65 72 20 6f  dicate whether o
0460: 72 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61 63  r not shared cac
0470: 68 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20  he is enabled.  
0480: 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74 20  Also,.** a list 
0490: 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  of BtShared obje
04a0: 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c 69  cts that are eli
04b0: 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69 63  gible for partic
04c0: 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68  ipation.** in sh
04d0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
04e0: 20 76 61 72 69 61 62 6c 65 73 20 68 61 76 65 20   variables have 
04f0: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0500: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0510: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
0520: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
0530: 6f 20 61 63 63 65 73 73 20 74 68 65 73 65 20 76  o access these v
0540: 61 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20 6d  ariables so we m
0550: 61 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f 62  ake them.** glob
0560: 61 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69 6c  al for test buil
0570: 64 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds..*/.#ifdef SQ
0580: 4c 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72  LITE_TEST.BtShar
0590: 65 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65  ed *sqlite3Share
05a0: 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a  dCacheList = 0;.
05b0: 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72 65  int sqlite3Share
05c0: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20  dCacheEnabled = 
05d0: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
05e0: 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65  BtShared *sqlite
05f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
0600: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
0610: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0620: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  cheEnabled = 0;.
0630: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
0640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
0650: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
0660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0670: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
0680: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
0690: 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65  isable the share
06a0: 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65  d pager and sche
06b0: 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a  ma features..**.
06c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
06d0: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  has no effect on
06e0: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
06f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
0700: 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61  ** The shared ca
0710: 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65  che setting effe
0720: 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20  cts only future 
0730: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
0740: 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69  te3_open(), sqli
0750: 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72  te3_open16(), or
0760: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
0770: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
0780: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
0790: 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c  _cache(int enabl
07a0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68 61  e){.  sqlite3Sha
07b0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
07c0: 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75  = enable;.  retu
07d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
07e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46  #endif.../*.** F
07f0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
0800: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
0810: 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
0820: 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42 74  Btree*, Pgno, Bt
0830: 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a 0a  Cursor*, i64);..
0840: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0850: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0860: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
0870: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0880: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0890: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
08a0: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
08b0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
08c0: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
08d0: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
08e0: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
08f0: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0900: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0910: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0920: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0930: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0940: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0950: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0960: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0970: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0980: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0990: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
09a0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
09b0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
09c0: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
09d0: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
09e0: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
09f0: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0a00: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0a10: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
0a20: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a30: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
0a40: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0a50: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0a60: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0a70: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0a90: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0aa0: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0ab0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0ac0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0ad0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0ae0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0af0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0b00: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0b10: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0b20: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0b30: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0b40: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0b50: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0b60: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0b70: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0b80: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0b90: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0ba0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0bb0: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0bc0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0bd0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0be0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0bf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0c00: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0c10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0c20: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0c30: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0c40: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0c50: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0c60: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
0c70: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
0c80: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
0c90: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
0ca0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
0cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0cc0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
0cd0: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
0ce0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
0cf0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
0d00: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
0d10: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
0d20: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
0d30: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
0d40: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
0d50: 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  && pBt->pExclusi
0d60: 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74  ve!=p ){.    ret
0d70: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0d80: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  D;.  }..  /* Thi
0d90: 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f  s (along with lo
0da0: 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68  ckTable()) is wh
0db0: 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ere the ReadUnco
0dc0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a  mmitted flag is.
0dd0: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e    ** dealt with.
0de0: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
0df0: 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61  s querying for a
0e00: 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74   read-lock and t
0e10: 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20  he flag is.  ** 
0e20: 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e  set, it is uncon
0e30: 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74  ditionally grant
0e40: 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65  ed - even if the
0e50: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
0e60: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
0e70: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
0e80: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
0e90: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
0ea0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
0eb0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
0ec0: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
0ed0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54  n function lockT
0ee0: 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61  able(), if a rea
0ef0: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
0f00: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
0f10: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0f20: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
0f30: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
0f40: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
0f50: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
0f60: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
0f70: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
0f80: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
0f90: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
0fa0: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
0fb0: 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20  cursors do.  ** 
0fc0: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
0fd0: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
0fe0: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70  s. The locking p
0ff0: 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a  rocedure for a .
1000: 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f    ** write-curso
1010: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
1020: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
1030: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
1040: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
1050: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
1060: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
1070: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
1080: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
1090: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
10a0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
10b0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
10c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
10d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
10e0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
10f0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a  Table==iTab && .
1100: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
1110: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c  ->eLock!=eLock |
1120: 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f  | eLock!=READ_LO
1130: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  CK) ){.        r
1140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1150: 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
1160: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1170: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1180: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
1190: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11a0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11c0: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
11d0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
11e0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
11f0: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
1200: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
1210: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
1220: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
1230: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
1240: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
1250: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
1260: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
1270: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1280: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1290: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
12a0: 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ly. SQLITE_BUSY 
12b0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  and.** SQLITE_NO
12c0: 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  MEM may also be 
12d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
12e0: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c  tic int lockTabl
12f0: 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
1300: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1310: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1320: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1330: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1340: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1350: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1360: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1370: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1380: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1390: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
13a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
13b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
13c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
13d0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
13e0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
13f0: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1400: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1410: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1420: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1430: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1440: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c  TE_OK==queryTabl
1450: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1460: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
1470: 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63   If the read-unc
1480: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1490: 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d   set and a read-
14a0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
14b0: 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65  d,.  ** return e
14c0: 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64  arly without add
14d0: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
14e0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
14f0: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1500: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1510: 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65  ction queryTable
1520: 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20  Lock() for more 
1530: 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67  info on handling
1540: 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55   .  ** the ReadU
1550: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e  ncommitted flag.
1560: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
1570: 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53   (p->db->flags&S
1580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1590: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
15a0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
15b0: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
15c0: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
15d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15e0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
15f0: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1600: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1610: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
1620: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
1630: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1640: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1650: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1660: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
1670: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1680: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
1690: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
16a0: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
16b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16d0: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
16e0: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
16f0: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1700: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1710: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
1720: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
1730: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
1740: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
1750: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
1760: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
1770: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
1780: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
1790: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
17a0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
17b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
17d0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
17e0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
17f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
1800: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
1810: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1820: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
1830: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
1840: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
1850: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
1860: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
1870: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1880: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
1890: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
18a0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
18b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
18c0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
18d0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
18e0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
18f0: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
1900: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
1910: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
1920: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
1930: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
1940: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
1950: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
1960: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
1970: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
1980: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1990: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
19a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
19b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
19c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
19d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
19e0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
19f0: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
1a00: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
1a10: 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54  lls to the lockT
1a20: 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64  able().** proced
1a30: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1a40: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
1a50: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1a60: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65  ckAllTables(Btre
1a70: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1a80: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a90: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
1aa0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
1ab0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1ac0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1ad0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1ae0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1af0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1b00: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1b10: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
1b20: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
1b30: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1b40: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1b50: 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75  0 || pBt->pExclu
1b60: 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  sive==pLock->pBt
1b70: 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ree );.    if( p
1b80: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
1b90: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
1ba0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
1bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1bc0: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
1bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
1be0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
1bf0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
1c00: 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c    if( pBt->pExcl
1c10: 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20  usive==p ){.    
1c20: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
1c30: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
1c40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1c50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1c60: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
1c70: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
1c80: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
1c90: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1ca0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
1cb0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
1cc0: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
1cd0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
1ce0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1cf0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
1d00: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
1d10: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
1d20: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1d30: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
1d40: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
1d50: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1d60: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1d70: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1d80: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1d90: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1da0: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
1db0: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
1dc0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
1dd0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
1de0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1df0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e00: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1e20: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
1e30: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
1e40: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
1e50: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
1e60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1e70: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
1e80: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
1e90: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
1ea0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
1eb0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
1ec0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1ed0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ee0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
1ef0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1f10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1f20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1f30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
1f40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1f50: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
1f60: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1f70: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
1f80: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
1f90: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1fa0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
1fb0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1fc0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
1fd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
1fe0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1ff0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
2000: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
2010: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
2020: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
2030: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
2040: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
2050: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2060: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2070: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2080: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2090: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
20a0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
20b0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
20c0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
20d0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
20e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
20f0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2100: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
2110: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
2120: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
2130: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
2140: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
2150: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
2160: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
2170: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
2180: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
2190: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
21a0: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
21b0: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
21c0: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
21d0: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
21e0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
21f0: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
2200: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
2210: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
2220: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
2230: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
2240: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
2250: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
2260: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2270: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
2280: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
2290: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
22a0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
22b0: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
22c0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
22d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22e0: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
22f0: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2300: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
2310: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2320: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2330: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
2340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2350: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2360: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
2370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2380: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2390: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
23a0: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50  ssert( !pCur->pP
23b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  age->intKey || !
23c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
23d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
23f0: 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
2400: 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
2410: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2420: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2430: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
2440: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
2450: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
2460: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
2470: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
2480: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2490: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
24a0: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
24b0: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
24c0: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
24d0: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
24e0: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
24f0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
2500: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
2510: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2520: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2530: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2540: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
2550: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
2560: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
2570: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
2580: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
2590: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
25a0: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
25b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25c0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25e0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
25f0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
2600: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2610: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2620: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2630: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
2640: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
2650: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
2660: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
2670: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2680: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2690: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
26a0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
26b0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
26c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
26d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
26e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2700: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
2710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2720: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2730: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
2740: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2750: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2760: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2770: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2780: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2790: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
27a0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
27b0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
27c0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
27e0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
27f0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
2800: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
2810: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
2820: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
2830: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2840: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
2850: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
2860: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
2870: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
2880: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
2890: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
28a0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
28b0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
28c0: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
28d0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
28e0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
28f0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
2900: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
2910: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2920: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
2930: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
2940: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2950: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
2960: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2970: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2980: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
2990: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
29a0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
29b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29c0: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
29d0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
29e0: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
29f0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2a00: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71  VALID;.  rc = sq
2a10: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2a20: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
2a30: 79 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  y, 0, pCur->nKey
2a40: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
2a50: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2a70: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
2a80: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
2a90: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
2aa0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ab0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ac0: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2ad0: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2ae0: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
2af0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
2b00: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
2b10: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
2b20: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
2b30: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
2b40: 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  \.         sqlit
2b50: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43 75  e3BtreeRestoreCu
2b60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2b70: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
2b80: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
2b90: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2ba0: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
2bb0: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
2bc0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
2bd0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
2be0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 20 63  ed at.  Cursor c
2bf0: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
2c00: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
2c10: 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20  inting.** at is 
2c20: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
2c30: 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a   under them..**.
2c40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2c50: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2c60: 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69   code if somethi
2c70: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
2c80: 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a  The.** integer *
2c90: 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74  pHasMoved is set
2ca0: 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63   to one if the c
2cb0: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
2cc0: 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f  and 0 if not..*/
2cd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ce0: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
2cf0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d00: 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b  int *pHasMoved){
2d10: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
2d20: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2d30: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2d40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d50: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
2d60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d70: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
2d80: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d90: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69  LID || pCur->ski
2da0: 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61  p!=0 ){.    *pHa
2db0: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  sMoved = 1;.  }e
2dc0: 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  lse{.    *pHasMo
2dd0: 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ved = 0;.  }.  r
2de0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2df0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2e00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e10: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2e30: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
2e40: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
2e50: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2e60: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
2e70: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
2e80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
2e90: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
2ea0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
2eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
2ec0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
2ed0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2ee0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
2ef0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c  PagesPerMapPage,
2f00: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
2f10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2f30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
2f40: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
2f50: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2f60: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
2f70: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
2f80: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
2f90: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
2fa0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
2fb0: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
2fc0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2fd0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2fe0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
2ff0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
3000: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
3010: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
3020: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3030: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
3040: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
3050: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
3060: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
3070: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
3080: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
3090: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
30a0: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
30b0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
30c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
30d0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
30e0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
30f0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
3100: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
3110: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
3120: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
3130: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
3140: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
3150: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
3160: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3170: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
3180: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
3190: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
31a0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
31b0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
31c0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
31d0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
31e0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
31f0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
3200: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
3210: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3220: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3230: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3240: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3250: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3260: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3270: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3280: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3290: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
32a0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
32b0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
32c0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
32d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
32e0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
32f0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
3300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3310: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3320: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3330: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3340: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3350: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3360: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3370: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3390: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
33a0: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
33b0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
33c0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
33d0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
33e0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
33f0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
3400: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3410: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3420: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3430: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3440: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3450: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3460: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3470: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3480: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
3490: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34a0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
34b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
34d0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
34e0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
34f0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3500: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3520: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3530: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3540: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3550: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3560: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3570: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3580: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
3590: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
35a0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
35b0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
35c0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
35d0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
35e0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
35f0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
3600: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3610: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3620: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3630: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3640: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3660: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3670: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3680: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
3690: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
36a0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
36b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
36c0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
36d0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
36e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
36f0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
3700: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3710: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3720: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3730: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3740: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3750: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3760: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3770: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3790: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
37a0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
37b0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
37c0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
37d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
37e0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
37f0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
3800: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3810: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3820: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3830: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3840: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3850: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3860: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
3870: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
3880: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
3890: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
38a0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
38b0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
38c0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
38d0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
38e0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
38f0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
3900: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
3910: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
3920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3930: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
3940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3950: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3960: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
3970: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
3980: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
3990: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
39a0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
39b0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
39c0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
39d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
39e0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
39f0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
3a00: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
3a10: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
3a20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
3a30: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
3a40: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
3a50: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3a60: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
3a70: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3a80: 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50   iCell) \.  ((pP
3a90: 61 67 65 29 2d 3e 61 44 61 74 61 20 2b 20 67 65  age)->aData + ge
3aa0: 74 32 62 79 74 65 28 26 28 70 50 61 67 65 29 2d  t2byte(&(pPage)-
3ab0: 3e 61 44 61 74 61 5b 28 70 50 61 67 65 29 2d 3e  >aData[(pPage)->
3ac0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43  cellOffset+2*(iC
3ad0: 65 6c 6c 29 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  ell)]))../*.** T
3ae0: 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  his a more compl
3af0: 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69  ex version of fi
3b00: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
3b10: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
3b20: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
3b30: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
3b40: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
3b50: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
3b60: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3b70: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3b80: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ba0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
3bb0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
3bc0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
3bd0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
3be0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
3bf0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
3c00: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
3c10: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
3c20: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
3c30: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
3c40: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
3c50: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
3c60: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
3c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3c80: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
3c90: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
3ca0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
3cb0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
3cc0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
3cd0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
3ce0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
3cf0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
3d00: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
3d10: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
3d20: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
3d30: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
3d40: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
3d50: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
3d60: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
3d70: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
3d80: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
3d90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3da0: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
3db0: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
3dc0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
3dd0: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
3de0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
3df0: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
3e00: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
3e10: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
3e20: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
3e30: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
3e40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
3e50: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
3e60: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
3e70: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
3e80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
3e90: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3ea0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3ec0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
3ed0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
3ee0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
3ef0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3f00: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
3f10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
3f20: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
3f30: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
3f40: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
3f50: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3f70: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
3f80: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
3f90: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3fb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3fc0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
3fd0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
3fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3ff0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
4000: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
4010: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
4020: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
4030: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
4040: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
4050: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
4060: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
4070: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
4080: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
4090: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
40a0: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
40b0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
40c0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
40d0: 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
40e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66   = 0;.  }.  pInf
40f0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
4100: 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65  oad;.  if( pPage
4110: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4120: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
4130: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a  pCell[n], (u64 *
4140: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
4150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32    }else{.    u32
4160: 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   x;.    n += get
4170: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
4180: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 70 49 6e 66  n], x);.    pInf
4190: 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20  o->nKey = x;.   
41a0: 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a   nPayload += x;.
41b0: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
41c0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
41d0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
41e0: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
41f0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
4200: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
4210: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
4220: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
4230: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
4240: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
4250: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
4260: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
4270: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4280: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4290: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
42a0: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
42b0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
42c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
42d0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
42e0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
42f0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
4300: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
4310: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
4320: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
4330: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
4340: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
4350: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
4360: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
4370: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
4380: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4390: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
43a0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
43b0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
43c0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
43d0: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
43e0: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
43f0: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
4400: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
4410: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
4420: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
4430: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
4440: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
4450: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
4460: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4470: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4480: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4490: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
44a0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
44b0: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
44c0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
44d0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
44e0: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
44f0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
4500: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
4510: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
4520: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
4530: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
4540: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
4550: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
4560: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4570: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4580: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4590: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
45a0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
45b0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
45c0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
45d0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
45e0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
45f0: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
4600: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
4610: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
4620: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
4630: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
4640: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
4650: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
4660: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4670: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4680: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4690: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
46a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
46b0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
46c0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
46d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
46e0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
46f0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
4700: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
4710: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
4720: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
4730: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
4740: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
4750: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
4760: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
4770: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
4780: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
4790: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
47a0: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
47b0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
47c0: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
47d0: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
47e0: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
47f0: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
4800: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
4810: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
4820: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
4830: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
4840: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
4850: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
4860: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
4870: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
4880: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
4890: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
48a0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
48b0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
48c0: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
48d0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
48e0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
48f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
4900: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
4910: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
4920: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
4930: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
4940: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
4950: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
4960: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
4970: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
4980: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
4990: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
49a0: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
49b0: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
49c0: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
49d0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
49e0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
49f0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
4a00: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
4a10: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
4a20: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4a30: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4a40: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
4a50: 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   iCell, &info);.
4a60: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4a70: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74  ize;.}.#endif.st
4a80: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4a90: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
4aa0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4ab0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4ac0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4ad0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4ae0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4af0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
4b00: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
4b10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4b20: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
4b30: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
4b40: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
4b50: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
4b60: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4b70: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4b80: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4b90: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4ba0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4bb0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4bc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4bd0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
4be0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4bf0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
4c00: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73  lInfo info;.  as
4c10: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
4c20: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4c30: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4c40: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4c50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
4c60: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4c70: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4c80: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
4c90: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69  load );.  if( (i
4ca0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
4cb0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
4cc0: 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
4cd0: 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  al ){.    Pgno o
4ce0: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
4cf0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
4d00: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75  flow]);.    retu
4d10: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
4d20: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
4d30: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
4d40: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
4d50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4d60: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
4d70: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
4d80: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
4d90: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
4da0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
4db0: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
4dc0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
4dd0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4de0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
4df0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
4e00: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
4e10: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
4e20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4e30: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
4e40: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
4e50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4e60: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
4e70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
4e80: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
4e90: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
4ea0: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
4eb0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4ec0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
4ed0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4ee0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
4ef0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
4f00: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
4f10: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
4f20: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
4f30: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
4f40: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
4f50: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
4f60: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
4f70: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
4f80: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
4f90: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
4fa0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
4fb0: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
4fc0: 69 63 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65  ic void defragme
4fd0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
4fe0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
5010: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
5020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5030: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5040: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
5050: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5070: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
5080: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
5090: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
50a0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
50d0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
50e0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5100: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
5110: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
5120: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
5130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
5140: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
5150: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
5160: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5170: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
5180: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
5190: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
51a0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
51b0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
51c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
51d0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
51e0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
51f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5200: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
5210: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
5220: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5230: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
5240: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
5250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
5260: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
5270: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
5280: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
5290: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
52a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
52b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
52c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
52d0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
52e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
52f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
5300: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
5310: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
5320: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
5330: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
5340: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5350: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5360: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
5370: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
5380: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
5390: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
53a0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
53b0: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
53c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
53d0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
53e0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
53f0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
5400: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
5410: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
5420: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
5430: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
5440: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
5450: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62  >usableSize;.  b
5460: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
5470: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
5480: 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d  emcpy(&temp[brk]
5490: 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
54a0: 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b  ableSize - brk);
54b0: 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53  .  brk = usableS
54c0: 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ize;.  for(i=0; 
54d0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
54e0: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
54f0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
5500: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
5510: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
5520: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
5530: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
5540: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
5550: 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67   assert( pc<pPag
5560: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
5570: 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  ze );.    size =
5580: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
5590: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
55a0: 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b      brk -= size;
55b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
55c0: 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  a[brk], &temp[pc
55d0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
55e0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72  t2byte(pAddr, br
55f0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
5600: 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65  ( brk>=cellOffse
5610: 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  t+2*nCell );.  p
5620: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
5630: 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61  r+5], brk);.  da
5640: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
5650: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
5660: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
5670: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
5680: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
5690: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
56a0: 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61  [addr], 0, brk-a
56b0: 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ddr);.}../*.** A
56c0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
56d0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20  tes of space on 
56e0: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  a page..**.** Re
56f0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
5700: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
5710: 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  [] of the first 
5720: 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  byte of.** the n
5730: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ew allocation.  
5740: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
5750: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
5760: 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70   is enough.** sp
5770: 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ace.  This routi
5780: 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 61  ne will never fa
5790: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  il..**.** If the
57a0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
57b0: 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70  Bytes of free sp
57c0: 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ace but does not
57d0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74   contain.** nByt
57e0: 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  es of contiguous
57f0: 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65   free space, the
5800: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
5810: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
5820: 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e  calls defragemen
5830: 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f  tPage() to conso
5840: 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20  lidate all free 
5850: 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a  space before .**
5860: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
5870: 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  new chunk..*/.st
5880: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
5890: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
58a0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
58b0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
58c0: 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69  c, hdr;.  int si
58d0: 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b  ze;.  int nFrag;
58e0: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e  .  int top;.  in
58f0: 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63  t nCell;.  int c
5900: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  ellOffset;.  uns
5910: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5920: 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50  ;.  .  data = pP
5930: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
5940: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
5950: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
5960: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
5970: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5980: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
5990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
59a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
59b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
59c0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
59d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
59e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
59f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5a00: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
5a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5a20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
5a30: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
5a40: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72   -= nByte;.  hdr
5a50: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
5a60: 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  set;..  nFrag = 
5a70: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
5a80: 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20  f( nFrag<60 ){. 
5a90: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
5aa0: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
5ab0: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
5ac0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
5ad0: 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70  fy the.    ** sp
5ae0: 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a  ace request. */.
5af0: 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31      addr = hdr+1
5b00: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63  ;.    while( (pc
5b10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5b20: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
5b30: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
5b40: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
5b50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
5b60: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
5b70: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79      if( size<nBy
5b80: 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  te+4 ){.        
5b90: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
5ba0: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
5bb0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
5bc0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72  ata[hdr+7] = nFr
5bd0: 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  ag + size - nByt
5be0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e;.          ret
5bf0: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5c10: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5c20: 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74  pc+2], size-nByt
5c30: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
5c40: 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d  turn pc + size -
5c50: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5c60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5c70: 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d  addr = pc;.    }
5c80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
5c90: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
5ca0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
5cb0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
5cc0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
5cd0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
5ce0: 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20  ent area..  */. 
5cf0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
5d00: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
5d10: 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
5d20: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
5d30: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
5d40: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
5d50: 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  t;.  if( nFrag>=
5d60: 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74  60 || cellOffset
5d70: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70   + 2*nCell > top
5d80: 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20   - nByte ){.    
5d90: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
5da0: 50 61 67 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d  Page);.    top =
5db0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5dc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5dd0: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5de0: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5df0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5e00: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5e10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5e20: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5e30: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
5e40: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
5e50: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
5e60: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
5e70: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
5e80: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
5e90: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5ea0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5eb0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5ec0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5ed0: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5ee0: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5ef0: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5f00: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5f10: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5f20: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5f30: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
5f40: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
5f50: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
5f60: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
5f70: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
5f80: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
5f90: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
5fa0: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
5fb0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
5fc0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
5fd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5fe0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5ff0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
6000: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
6010: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
6020: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
6030: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
6040: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
6050: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
6060: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
6070: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
6080: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
6090: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
60a0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
60b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
60c0: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
60d0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
60e0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
60f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
6100: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
6110: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
6120: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
6130: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
6140: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
6150: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
6160: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
6170: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
6180: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
6190: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
61a0: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
61b0: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
61c0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
61d0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
61e0: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
61f0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
6200: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
6210: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
6220: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6230: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
6240: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
6250: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6260: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6270: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6280: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6290: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
62a0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
62b0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
62c0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
62d0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
62e0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
62f0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
6300: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
6310: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
6320: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
6330: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
6340: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
6350: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
6360: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
6370: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
6380: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
6390: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
63a0: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
63b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
63c0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
63d0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
63e0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
63f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
6400: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
6410: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6420: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
6430: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6440: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6450: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
6460: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6470: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
6480: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
6490: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
64a0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
64b0: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
64c0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
64d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
64e0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
64f0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
6500: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
6510: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
6520: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
6530: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
6540: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
6550: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
6560: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6570: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
6580: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
6590: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
65a0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
65b0: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
65c0: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
65d0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
65e0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
65f0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
6600: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
6610: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
6620: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
6630: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
6640: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
6650: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
6660: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
6670: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
6680: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
6690: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
66a0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
66b0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
66c0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
66d0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
66e0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
66f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
6700: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
6710: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
6720: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
6730: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
6740: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
6750: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
6760: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
6770: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
6780: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
6790: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
67a0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
67b0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
67c0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
67d0: 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65  atic void decode
67e0: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
67f0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
6800: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
6810: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
6820: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
6830: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
6840: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6850: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
6860: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
6870: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6880: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6890: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
68a0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  );.  pPage->intK
68b0: 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  ey = (flagByte &
68c0: 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46   (PTF_INTKEY|PTF
68d0: 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a  _LEAFDATA))!=0;.
68e0: 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74    pPage->zeroDat
68f0: 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  a = (flagByte & 
6900: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30  PTF_ZERODATA)!=0
6910: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
6920: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
6930: 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50  F_LEAF)!=0;.  pP
6940: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
6950: 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65  e = 4*(pPage->le
6960: 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20  af==0);.  pBt = 
6970: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
6980: 28 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46  ( flagByte & PTF
6990: 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20  _LEAFDATA ){.   
69a0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
69b0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
69c0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
69d0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
69e0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
69f0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
6a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
6a10: 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a  ->leafData = 0;.
6a20: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
6a30: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
6a40: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
6a50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
6a60: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
6a70: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
6a80: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
6a90: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
6aa0: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
6ab0: 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a  afData));.}../*.
6ac0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
6ad0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
6ae0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
6af0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
6b00: 54 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  The pParent para
6b10: 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20  meter must be a 
6b20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
6b30: 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20  emPage which.** 
6b40: 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  is the parent of
6b50: 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
6b60: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
6b70: 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42  e root of a.** B
6b80: 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65  Tree has no pare
6b90: 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68  nt and so for th
6ba0: 61 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74  at page, pParent
6bb0: 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ==NULL..**.** Re
6bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
6bd0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
6be0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
6bf0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
6c00: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
6c10: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
6c20: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
6c30: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
6c40: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
6c50: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
6c60: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
6c70: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
6c80: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
6c90: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
6ca0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
6cb0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
6cc0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
6cd0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
6ce0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
6cf0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
6d00: 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ge,        /* Th
6d10: 65 20 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69  e page to be ini
6d20: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65  tialized */.  Me
6d30: 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20  mPage *pParent  
6d40: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
6d50: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
6d60: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70  LL */.){.  int p
6d70: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
6d80: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
6d90: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
6da0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
6db0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
6dc0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6dd0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
6de0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
6df0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
6e00: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
6e10: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
6e20: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
6e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
6e40: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
6e50: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ure */.  int usa
6e60: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
6e70: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
6e80: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
6e90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
6ea0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
6eb0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
6ec0: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
6ed0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
6ee0: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
6ef0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f00: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
6f10: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
6f20: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
6f30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
6f40: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
6f50: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
6f60: 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20  u8 *pOff;       
6f70: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
6f80: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c  sed to check all
6f90: 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72   cell offsets ar
6fa0: 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  e in range */.  
6fb0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
6fc0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
6fd0: 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66   end of cell off
6fe0: 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 75  set array */.  u
6ff0: 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  8 mask;         
7000: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
7010: 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a  s that must be z
7020: 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65  ero in MSB of ce
7030: 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 0a 20  ll offsets */.. 
7040: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
7050: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  t;.  assert( pBt
7060: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7070: 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70   pParent==0 || p
7080: 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74  Parent->pBt==pBt
7090: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
70a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
70b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
70c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
70d0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
70e0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
70f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
7100: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7110: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
7120: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
7130: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
7140: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
7150: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
7160: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
7170: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
7180: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
7190: 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20 28 70  t!=pParent && (p
71a0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30  Page->pParent!=0
71b0: 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49 6e 69   || pPage->isIni
71c0: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
71d0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 68 6f   parent page sho
71e0: 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  uld never change
71f0: 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65   unless the file
7200: 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   is corrupt */. 
7210: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7220: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7230: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
7240: 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
7250: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
7260: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
7270: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
7280: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70   ){.    pPage->p
7290: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
72a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
72b0: 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
72c0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68  DbPage);.  }.  h
72d0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
72e0: 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
72f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
7300: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
7310: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20  e, data[hdr]);. 
7320: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7330: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
7340: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
7350: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
7360: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
7370: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
7380: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
7390: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
73a0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70  age->leaf;.  top
73b0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
73c0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61  a[hdr+5]);.  pPa
73d0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
73e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
73f0: 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
7400: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
7410: 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
7420: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
7430: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
7440: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
7450: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
7460: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7470: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7480: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
7490: 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
74a0: 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  !=0 && pParent->
74b0: 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f  pgno!=1 ){.    /
74c0: 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  * All pages must
74d0: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
74e0: 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20  ne cell, except 
74f0: 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  for root pages *
7500: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
7510: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7520: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
7530: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
7540: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
7550: 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67  page */.  pc = g
7560: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
7570: 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d  r+1]);.  nFree =
7580: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
7590: 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74  op - (cellOffset
75a0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
75b0: 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3e  l);.  while( pc>
75c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78  0 ){.    int nex
75d0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  t, size;.    if(
75e0: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
75f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
7600: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
7610: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
7620: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7630: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7640: 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d 20 67    }.    next = g
7650: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
7660: 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 67  ]);.    size = g
7670: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
7680: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  +2]);.    if( ne
7690: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
76a0: 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20  +size+3 ){.     
76b0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
76c0: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
76d0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
76e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
76f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
7700: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72 65 65  .    }.    nFree
7710: 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 70 63   += size;.    pc
7720: 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70   = next;.  }.  p
7730: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46  Page->nFree = nF
7740: 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72 65 65  ree;.  if( nFree
7750: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
7760: 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63      /* Free spac
7770: 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
7780: 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20  total page size 
7790: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
77a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
77b0: 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  T; .  }..  /* Ch
77c0: 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65  eck that all the
77d0: 20 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20   offsets in the 
77e0: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
77f0: 79 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  y are within ran
7800: 67 65 2e 20 2a 2f 0a 20 20 6d 61 73 6b 20 3d 20  ge. */.  mask = 
7810: 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67  ~(((u8)(pBt->pag
7820: 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20  eSize>>8))-1);. 
7830: 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65   pEnd = &data[ce
7840: 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65  llOffset + pPage
7850: 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 66 6f  ->nCell*2];.  fo
7860: 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c  r(pOff=&data[cel
7870: 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d  lOffset]; pOff!=
7880: 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66  pEnd && !((*pOff
7890: 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32  )&mask); pOff+=2
78a0: 29 3b 0a 20 20 69 66 28 20 70 4f 66 66 21 3d 70  );.  if( pOff!=p
78b0: 45 6e 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  End ){.    retur
78c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
78d0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 50  _BKPT;.  }..  pP
78e0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
78f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7900: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
7910: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
7920: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
7930: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
7940: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
7950: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
7960: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
7970: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
7980: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
7990: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
79a0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
79b0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
79c0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
79d0: 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d  pBt;.  int hdr =
79e0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
79f0: 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a  t;.  int first;.
7a00: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7a10: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
7a20: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
7a30: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
7a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7a50: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
7a60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7a70: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
7a80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7a90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7aa0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
7ab0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
7ac0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7ad0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7ae0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7af0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7b00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7b10: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7b20: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
7b30: 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
7b40: 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
7b50: 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67  data[hdr] = flag
7b60: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
7b70: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
7b80: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a  &PTF_LEAF)==0);.
7b90: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
7ba0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
7bb0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
7bc0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7bd0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
7be0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
7bf0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
7c00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
7c10: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
7c20: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
7c30: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
7c40: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
7c50: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7c60: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
7c70: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
7c80: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
7c90: 69 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ift = 0;.  pPage
7ca0: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
7cb0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
7cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
7cd0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
7ce0: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
7cf0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
7d00: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
7d10: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
7d20: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
7d30: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
7d40: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
7d50: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
7d60: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
7d70: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
7d80: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
7d90: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
7da0: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
7db0: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
7dc0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
7dd0: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
7de0: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
7df0: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
7e00: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
7e10: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
7e20: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
7e30: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
7e40: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
7e50: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
7e60: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
7e70: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
7e80: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
7e90: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
7ea0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
7eb0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
7ec0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
7ed0: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
7ee0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
7ef0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
7f00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
7f10: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
7f20: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
7f30: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
7f40: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
7f50: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
7f60: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
7f70: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
7f80: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
7f90: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
7fa0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
7fb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
7fc0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
7fd0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7ff0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8010: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
8020: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
8030: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
8040: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
8050: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8060: 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  c;.  pPage = (Me
8070: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
8080: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
8090: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
80a0: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
80b0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
80c0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
80d0: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
80e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
80f0: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
8100: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
8110: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
8120: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
8130: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70  ? 100 : 0;.  *pp
8140: 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
8150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
8170: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
8180: 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
8190: 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ize it.  This ro
81a0: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74  utine.** is just
81b0: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77   a convenience w
81c0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65  rapper around se
81d0: 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a  parate calls to.
81e0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ** sqlite3BtreeG
81f0: 65 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c  etPage() and sql
8200: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8210: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
8220: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
8230: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
8240: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
8250: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
8260: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8270: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
8280: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
8290: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
82a0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
82b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
82c0: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
82d0: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
82e0: 70 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50  pParent     /* P
82f0: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
8300: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
8310: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8320: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8330: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8340: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
8350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8360: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
8370: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8380: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
8390: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
83a0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
83b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70  SQLITE_OK && (*p
83c0: 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
83d0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
83e0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
83f0: 67 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72  ge(*ppPage, pPar
8400: 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
8410: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8420: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
8430: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
8440: 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
8450: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8460: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
8470: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
8480: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
8490: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
84a0: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
84b0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
84c0: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
84d0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
84e0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
84f0: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
8500: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
8510: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
8520: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8530: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8540: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8550: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
8560: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
8570: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
8580: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8590: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
85a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
85b0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
85c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
85d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
85e0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
85f0: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
8600: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
8610: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
8620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
8630: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8640: 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  d when the refer
8650: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
8660: 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73   page.** reaches
8670: 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20   zero.  We need 
8680: 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50 61  to unref the pPa
8690: 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65  rent pointer whe
86a0: 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e  n that.** happen
86b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
86c0: 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  d pageDestructor
86d0: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20  (DbPage *pData, 
86e0: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
86f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
8700: 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65  .  assert( (page
8710: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
8720: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8730: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
8740: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
8750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8760: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  e->isInit==0 || 
8770: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8780: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
8790: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
87a0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Page->pParent ){
87b0: 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
87c0: 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
87d0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73 73 65  Parent;.    asse
87e0: 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  rt( pParent->pBt
87f0: 3d 3d 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ==pPage->pBt );.
8800: 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
8810: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  nt = 0;.    rele
8820: 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29  asePage(pParent)
8830: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69  ;.  }.  pPage->i
8840: 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  sInit = 0;.}../*
8850: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
8860: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
8870: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
8880: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
8890: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
88a0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
88b0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
88c0: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
88d0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
88e0: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
88f0: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
8900: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
8910: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8920: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
8930: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
8940: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
8950: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
8960: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
8970: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
8980: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
8990: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
89a0: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
89b0: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20  (DbPage *pData, 
89c0: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
89d0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
89e0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65  .  assert( (page
89f0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
8a00: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8a10: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
8a20: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
8a30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8a40: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
8a50: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8a60: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8a70: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8a80: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
8a90: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8aa0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
8ab0: 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  age, pPage->pPar
8ac0: 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ent);.  }.}../*.
8ad0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
8ae0: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
8af0: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
8b00: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  c int sqlite3Btr
8b10: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
8b20: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ler(void *pArg, 
8b30: 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61 72  int n){.  BtShar
8b40: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
8b50: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
8b60: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
8b70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8b80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8b90: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
8ba0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8bb0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
8bc0: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
8bd0: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
8be0: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
8bf0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
8c00: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
8c10: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
8c20: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
8c30: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
8c40: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
8c50: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
8c60: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
8c70: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
8c80: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
8c90: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
8ca0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
8cb0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
8cc0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
8cd0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
8ce0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
8cf0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
8d00: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
8d10: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
8d20: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
8d30: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
8d40: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
8d50: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
8d60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8d70: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
8d80: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
8d90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
8da0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
8db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
8dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
8dd0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
8de0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
8df0: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
8e00: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8e10: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
8e20: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
8e30: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e50: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
8e60: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
8e70: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
8e80: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
8e90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8ea0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
8eb0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
8ec0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
8ed0: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
8ee0: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
8ef0: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
8f00: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
8f10: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
8f20: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
8f30: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
8f40: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
8f50: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
8f60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8f70: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  int nReserve;.  
8f80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
8f90: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20  bHeader[100];.. 
8fa0: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
8fb0: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
8fc0: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
8fd0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
8fe0: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
8ff0: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
9000: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
9010: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
9020: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
9030: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
9040: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
9050: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
9060: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
9070: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
9080: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
9090: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
90a0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
90b0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
90c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
90d0: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
90e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
90f0: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
9100: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
9110: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
9120: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
9130: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
9140: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
9150: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
9160: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
9170: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
9180: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9190: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
91a0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
91b0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
91c0: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
91d0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
91e0: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
91f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9200: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9210: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
9220: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
9230: 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65  b = db;..#if !de
9240: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9250: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9260: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
9270: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
9280: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
9290: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
92a0: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
92b0: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
92c0: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
92d0: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
92e0: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
92f0: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
9300: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
9310: 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c  =0.   && (db->fl
9320: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61  ags & SQLITE_Vta
9330: 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c  b)==0.   && zFil
9340: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
9350: 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69  me[0].  ){.    i
9360: 66 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  f( sqlite3Shared
9370: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
9380: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
9390: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
93a0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
93b0: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
93c0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
93d0: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
93e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
93f0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
9400: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
9410: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9420: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
9430: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9440: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
9450: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
9460: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9470: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9480: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9490: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
94a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
94b0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
94c0: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
94d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
94e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
94f0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
9500: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
9510: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9520: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
9530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9540: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9550: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9560: 6f 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68  or(pBt=sqlite3Sh
9570: 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70  aredCacheList; p
9580: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
9590: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
95a0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
95b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
95c0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
95d0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
95e0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
95f0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
9610: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
9620: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
9630: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
9640: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9650: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
9660: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
9670: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9690: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
96a0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
96b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
96c0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
96d0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
96e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
96f0: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
9700: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
9710: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
9720: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
9730: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
9740: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
9750: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
9760: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
9770: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
9780: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
9790: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
97a0: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
97b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
97c0: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
97d0: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
97e0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
97f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9800: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
9810: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9820: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
9830: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
9840: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
9850: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
9860: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
9870: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
9880: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
9890: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
98a0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
98b0: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
98c0: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
98d0: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
98e0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
98f0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
9900: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
9910: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
9920: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
9930: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
9940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9950: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
9960: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
9970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9980: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
9990: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
99a0: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
99b0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
99c0: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
99d0: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
99e0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
99f0: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
9a00: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
9a10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9a20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
9a30: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
9a40: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
9a50: 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20  ->busyHdr.xFunc 
9a60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
9a70: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b  vokeBusyHandler;
9a80: 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64  .    pBt->busyHd
9a90: 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20  r.pArg = pBt;.  
9aa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9ab0: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
9ac0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
9ad0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
9b00: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  gs, vfsFlags);. 
9b10: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9b20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9b30: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
9b40: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
9b50: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
9b60: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
9b70: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
9b80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9b90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
9ba0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
9bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9bc0: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
9bd0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
9be0: 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64  er, &pBt->busyHd
9bf0: 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  r);.    p->pBt =
9c00: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c   pBt;.  .    sql
9c10: 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
9c20: 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67  ructor(pBt->pPag
9c30: 65 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74  er, pageDestruct
9c40: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
9c50: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
9c60: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
9c70: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70  geReinit);.    p
9c80: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
9c90: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
9ca0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72   = 0;.    pBt->r
9cb0: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
9cc0: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
9cd0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
9ce0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
9cf0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
9d00: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
9d10: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
9d20: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
9d30: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
9d40: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
9d50: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
9d60: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
9d70: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
9d80: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
9d90: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
9da0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
9db0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
9dc0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
9dd0: 69 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ize);.#ifndef SQ
9de0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9df0: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
9e00: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
9e10: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
9e20: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
9e30: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
9e40: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
9e50: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
9e60: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
9e70: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
9e80: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
9e90: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
9ea0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
9eb0: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
9ec0: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
9ed0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
9ee0: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
9ef0: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
9f00: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
9f10: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
9f20: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
9f30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
9f40: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
9f50: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
9f60: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
9f70: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
9f80: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
9f90: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
9fa0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
9fb0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9fc0: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
9fd0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
9fe0: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
9ff0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
a000: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
a010: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a020: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
a030: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
a040: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
a050: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
a060: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
a070: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
a080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a090: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
a0a0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
a0b0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
a0c0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
a0d0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
a0e0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
a0f0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
a100: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
a110: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
a120: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75      }.    pBt->u
a130: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
a140: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
a150: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
a160: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
a170: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
a180: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
a190: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
a1a0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
a1b0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
a1c0: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
a1d0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69  ageSize);.   .#i
a1e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a1f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
a200: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
a210: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
a220: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
a230: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
a240: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
a250: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
a260: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
a270: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
a280: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
a290: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
a2a0: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
a2b0: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
a2c0: 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53   1;.      mutexS
a2d0: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
a2e0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
a2f0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
a300: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28  STER);.      if(
a310: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a320: 46 45 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e  FE && sqlite3Con
a330: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
a340: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
a350: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
a360: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a370: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
a380: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
a390: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
a3a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a3b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
a3c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a3d0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
a3e0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
a3f0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a420: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
a430: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
a440: 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64   = sqlite3Shared
a450: 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20  CacheList;.     
a460: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
a470: 63 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20  cheList = pBt;. 
a480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
a490: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
a4a0: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
a4b0: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
a4c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a4d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a4e0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a4f0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a500: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
a510: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
a520: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
a530: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
a540: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
a550: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
a560: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
a570: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
a580: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
a590: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
a5a0: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
a5b0: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
a5c0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
a5d0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
a5e0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
a5f0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
a600: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a610: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
a620: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
a630: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
a640: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
a650: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
a660: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
a670: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
a680: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
a690: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
a6a0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a6b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
a6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
a6d0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
a6e0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
a6f0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
a700: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
a710: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
a720: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
a730: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
a740: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
a750: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
a760: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a770: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
a780: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
a790: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
a7a0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
a7b0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
a7c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
a7d0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a7e0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
a7f0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
a800: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
a810: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
a820: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
a830: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
a840: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
a850: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
a860: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a870: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
a880: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
a890: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
a8a0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
a8b0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
a8c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a8d0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
a8e0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
a8f0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
a900: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a910: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
a920: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
a930: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
a940: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
a950: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
a960: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
a970: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
a980: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
a990: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
a9a0: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
a9b0: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
a9c0: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
a9d0: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
a9e0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
a9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
aa00: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
aa10: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
aa20: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
aa30: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
aa40: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
aa50: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
aa60: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
aa70: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
aa80: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
aa90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
aaa0: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
aab0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
aac0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
aad0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
aae0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
aaf0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ab00: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
ab10: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
ab20: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
ab30: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
ab40: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ab50: 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  List==pBt ){.   
ab60: 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64     sqlite3Shared
ab70: 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 2d  CacheList = pBt-
ab80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
ab90: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
aba0: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
abb0: 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 77  cheList;.      w
abc0: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
abd0: 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
abe0: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
abf0: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
ac00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
ac10: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
ac20: 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
ac30: 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
ac40: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
ac50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ac60: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
ac70: 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
ac80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
ac90: 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
aca0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
acb0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
acc0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
acd0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
ace0: 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
acf0: 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
ad00: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
ad10: 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
ad20: 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
ad30: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
ad40: 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
ad50: 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
ad60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
ad70: 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
ad80: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ad90: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
ada0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
adb0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
adc0: 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
add0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
ade0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
adf0: 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
ae00: 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
ae10: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
ae20: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
ae30: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
ae40: 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
ae50: 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
ae60: 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
ae70: 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
ae80: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
ae90: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
aea0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
aeb0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
aec0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
aed0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
aee0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
aef0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
af00: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
af10: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
af20: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
af30: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
af40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
af50: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
af60: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
af70: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
af80: 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
af90: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
afa0: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
afb0: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
afc0: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
afd0: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
afe0: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
aff0: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
b000: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
b010: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
b020: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
b030: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
b040: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
b050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
b060: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
b070: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
b080: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
b090: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
b0a0: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
b0b0: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
b0c0: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
b0d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
b0e0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
b0f0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
b100: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
b110: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
b120: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
b130: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
b140: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
b150: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
b160: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
b170: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
b180: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
b190: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
b1a0: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
b1b0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
b1c0: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b1d0: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
b1e0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
b1f0: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
b200: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
b210: 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
b220: 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
b230: 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
b240: 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
b250: 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
b260: 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
b270: 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
b280: 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
b290: 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
b2a0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
b2b0: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
b2c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
b2d0: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
b2e0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
b2f0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
b300: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
b310: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
b320: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
b330: 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
b340: 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
b350: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
b360: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b370: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
b380: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
b390: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
b3a0: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
b3b0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
b3c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
b3d0: 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
b3e0: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
b3f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
b400: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
b410: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
b420: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
b430: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
b440: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
b450: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
b460: 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
b470: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b480: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b490: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b4a0: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
b4b0: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
b4c0: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
b4d0: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
b4e0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
b4f0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
b500: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
b510: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
b520: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
b530: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
b540: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
b550: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
b560: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
b570: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
b580: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
b590: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
b5a0: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
b5b0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
b5c0: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
b5d0: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
b5e0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
b5f0: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
b600: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
b610: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
b620: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
b630: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
b640: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
b650: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
b660: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
b670: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
b680: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
b690: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
b6a0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
b6b0: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
b6c0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
b6d0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
b6e0: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
b6f0: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
b700: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
b710: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
b720: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
b730: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
b740: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
b750: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b760: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
b770: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
b780: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
b790: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b7a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b7b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b7c0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
b7d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
b7e0: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
b7f0: 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
b800: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
b810: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
b820: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b830: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b840: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
b850: 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
b860: 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
b870: 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
b880: 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
b890: 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
b8a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
b8b0: 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
b8c0: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
b8d0: 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
b8e0: 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
b8f0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
b900: 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
b910: 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
b920: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
b930: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
b940: 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
b950: 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
b960: 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
b970: 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
b980: 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
b990: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
b9a0: 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
b9b0: 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
b9c0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
b9d0: 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
b9e0: 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
b9f0: 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
ba00: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
ba10: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
ba20: 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
ba30: 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74  te3BtreeSetSafet
ba40: 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c  yLevel(Btree *p,
ba50: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
ba60: 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53  fullSync){.  BtS
ba70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
ba80: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
ba90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
baa0: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
bab0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
bac0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
bad0: 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
bae0: 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  tyLevel(pBt->pPa
baf0: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
bb00: 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
bb10: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
bb20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bb30: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
bb40: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
bb50: 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
bb60: 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
bb70: 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
bb80: 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
bb90: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
bba0: 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
bbb0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
bbc0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
bbd0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
bbe0: 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
bbf0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bc00: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
bc10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bc20: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bc30: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
bc40: 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
bc50: 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
bc60: 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
bc70: 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
bc80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
bc90: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
bca0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bcb0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
bcc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
bcd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bce0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
bcf0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
bd00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
bd10: 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
bd20: 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
bd30: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
bd40: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
bd50: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
bd60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
bd70: 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
bd80: 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
bd90: 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
bda0: 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
bdb0: 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
bdc0: 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
bdd0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
bde0: 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
bdf0: 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
be00: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
be10: 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
be20: 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
be30: 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
be40: 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
be50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
be60: 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
be70: 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
be80: 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
be90: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
bea0: 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
beb0: 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
bec0: 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
bed0: 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
bee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
bef0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
bf00: 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
bf10: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
bf20: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
bf30: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
bf40: 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
bf50: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
bf60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bf70: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
bf80: 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
bf90: 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
bfa0: 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
bfb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bfc0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
bfd0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
bfe0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
bff0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
c000: 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
c010: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c020: 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
c030: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
c040: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
c050: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
c060: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
c070: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
c080: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
c090: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
c0a0: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
c0b0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
c0c0: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
c0d0: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
c0e0: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
c0f0: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
c100: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
c110: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
c120: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
c130: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
c140: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
c150: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66   pageSize;.    f
c160: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
c170: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c180: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
c190: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
c1a0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
c1b0: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
c1c0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
c1d0: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
c1e0: 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ve;.  sqlite3Btr
c1f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c200: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c210: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
c220: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
c230: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
c240: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
c250: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
c260: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
c270: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
c280: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c290: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
c2a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
c2b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c2c0: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
c2d0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c2e0: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
c2f0: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
c300: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c310: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
c320: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
c330: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
c340: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
c350: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
c360: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
c370: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
c380: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
c390: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
c3a0: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
c3b0: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
c3c0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
c3d0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
c3e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
c3f0: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
c400: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
c410: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
c420: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c430: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
c440: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
c450: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
c460: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
c470: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c480: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c490: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
c4a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
c4b0: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
c4c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c4d0: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
c4e0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c4f0: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
c500: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
c510: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
c520: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
c530: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
c540: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
c550: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
c560: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
c570: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
c580: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
c590: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
c5a0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
c5b0: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
c5c0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
c5d0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c5e0: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
c5f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c600: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
c610: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
c620: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
c630: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c640: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
c650: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
c660: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
c670: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
c680: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
c690: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c6a0: 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d  av = (autoVacuum
c6b0: 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ?1:0);..  sqlite
c6c0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c6d0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
c6e0: 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d  izeFixed && av!=
c6f0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c700: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
c710: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c720: 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
c730: 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a  utoVacuum = av;.
c740: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
c750: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c760: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c770: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c780: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c790: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
c7a0: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
c7b0: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
c7c0: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
c7d0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
c7e0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
c7f0: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
c800: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
c810: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c820: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
c830: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
c840: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
c850: 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
c860: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c870: 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
c880: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
c890: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c8a0: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
c8b0: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
c8c0: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
c8d0: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
c8e0: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
c8f0: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
c900: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c910: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c920: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
c930: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
c940: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
c950: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c960: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
c970: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
c980: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
c990: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
c9a0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c9b0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
c9c0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
c9d0: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
c9e0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
c9f0: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
ca00: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
ca10: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
ca20: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
ca30: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
ca40: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
ca50: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
ca60: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
ca70: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
ca80: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
ca90: 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
caa0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
cab0: 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
cac0: 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
cad0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
cae0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
caf0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb00: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ;.  if( pBt->pPa
cb10: 67 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ge1 ) return SQL
cb20: 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73  ITE_OK;.  rc = s
cb30: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
cb40: 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
cb50: 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
cb60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
cb70: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
cb80: 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
cb90: 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
cba0: 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
cbb0: 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
cbc0: 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
cbd0: 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
cbe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
cbf0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
cc00: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
cc10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cc20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
cc30: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
cc40: 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ed;.  }else if( 
cc50: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69  nPage>0 ){.    i
cc60: 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  nt pageSize;.   
cc70: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
cc80: 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
cc90: 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
cca0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ccb0: 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20  NOTADB;.    if( 
ccc0: 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
ccd0: 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
cce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
ccf0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
cd00: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
cd10: 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
cd20: 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
cd30: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
cd40: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
cd50: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
cd60: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
cd70: 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
cd80: 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
cd90: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
cda0: 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
cdb0: 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
cdc0: 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
cdd0: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
cde0: 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
cdf0: 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
ce00: 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
ce10: 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
ce20: 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
ce30: 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
ce40: 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
ce50: 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
ce60: 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
ce70: 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
ce80: 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
ce90: 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
cea0: 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
ceb0: 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
ced0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
cee0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
cef0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
cf00: 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
cf10: 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
cf20: 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
cf30: 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32   || pageSize<512
cf40: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c   ||.        (SQL
cf50: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
cf60: 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53  E<32768 && pageS
cf70: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
cf80: 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b  AGE_SIZE).    ){
cf90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
cfa0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
cfb0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
cfc0: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
cfd0: 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
cfe0: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
cff0: 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
d000: 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70   if( pageSize!=p
d010: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
d020: 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
d030: 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
d040: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
d050: 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
d060: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
d070: 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
d080: 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
d090: 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
d0a0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
d0b0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
d0c0: 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
d0d0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
d0e0: 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
d0f0: 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
d100: 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
d110: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
d120: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
d130: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
d140: 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
d150: 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
d160: 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
d170: 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
d180: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
d190: 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
d1a0: 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
d1b0: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
d1c0: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
d1d0: 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
d1e0: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
d1f0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
d200: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
d210: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
d220: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  geSize);.      r
d230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
d250: 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b  sableSize<500 ){
d260: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
d270: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d280: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
d290: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
d2a0: 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
d2b0: 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
d2c0: 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
d2d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d2e0: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
d2f0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
d300: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d310: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
d320: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
d330: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d340: 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
d350: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
d360: 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
d370: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
d380: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
d390: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
d3a0: 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
d3b0: 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
d3c0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
d3d0: 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
d3e0: 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
d3f0: 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
d400: 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
d410: 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
d420: 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
d430: 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
d440: 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
d450: 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
d460: 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
d470: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
d480: 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
d490: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
d4a0: 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
d4b0: 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
d4c0: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
d4d0: 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
d4e0: 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
d4f0: 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
d500: 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
d510: 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
d520: 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61  te poiner, a hea
d530: 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
d540: 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
d550: 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
d560: 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
d570: 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
d580: 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
d590: 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
d5a0: 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
d5b0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
d5c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d5d0: 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b  12)*64/255 - 23;
d5e0: 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
d5f0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
d600: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
d610: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c   23;.  pBt->maxL
d620: 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eaf = pBt->usabl
d630: 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42  eSize - 35;.  pB
d640: 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42  t->minLeaf = (pB
d650: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
d660: 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*32/255 - 23;. 
d670: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
d680: 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
d690: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
d6a0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d6b0: 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74   = pPage1;.  ret
d6c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
d6d0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d6e0: 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
d6f0: 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
d700: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
d710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d720: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d730: 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42  works like lockB
d740: 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68  tree() except th
d750: 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b  at it also invok
d760: 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63  es the.** busy c
d770: 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65  allback if there
d780: 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   is lock content
d790: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d7a0: 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  nt lockBtreeWith
d7b0: 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65  Retry(Btree *pRe
d7c0: 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  f){.  int rc = S
d7d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
d7e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
d7f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66  eHoldsMutex(pRef
d800: 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d  ) );.  if( pRef-
d810: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
d820: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69  NONE ){.    u8 i
d830: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
d840: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
d850: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72  saction;.    btr
d860: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
d870: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d880: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
d890: 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20  ns(pRef, 0);.   
d8a0: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
d8b0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72  ansaction = inTr
d8c0: 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70  ansaction;.    p
d8d0: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54  Ref->inTrans = T
d8e0: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69  RANS_NONE;.    i
d8f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d900: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e   ){.      pRef->
d910: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
d920: 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  n--;.    }.    b
d930: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
d940: 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ef);.  }.  retur
d950: 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a  n rc;.}.       .
d960: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
d970: 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
d980: 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
d990: 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
d9a0: 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
d9b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
d9c0: 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
d9d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
d9e0: 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
d9f0: 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
da00: 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
da10: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
da20: 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
da30: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
da40: 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
da50: 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
da60: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
da70: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  y outstanding cu
da80: 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74  rsors, this rout
da90: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
daa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
dab0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
dac0: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
dad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
dae0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
daf0: 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
db00: 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
db10: 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
db20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
db30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
db40: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
db50: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
db60: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
db70: 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ->pCursor==0 && 
db80: 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
db90: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
dba0: 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
dbb0: 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29  Bt->pPager)>=1 )
dbc0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dbd0: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
dbe0: 74 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  ta );.#if 0.    
dbf0: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
dc00: 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
dc10: 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
dc20: 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
dc30: 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
dc40: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
dc50: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
dc60: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
dc70: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
dc80: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
dc90: 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
dca0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   1;.      }.#end
dcb0: 69 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  if.      release
dcc0: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
dcd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
dce0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
dcf0: 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
dd00: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
dd10: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
dd20: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
dd30: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
dd40: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
dd50: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
dd60: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
dd70: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
dd80: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
dd90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dda0: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
ddb0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
ddc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ddd0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
dde0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
ddf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
de00: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
de10: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
de20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
de30: 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
de40: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
de50: 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
de60: 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
de70: 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
de80: 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
de90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
dea0: 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
deb0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
dec0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ded0: 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
dee0: 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
def0: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
df00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
df10: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
df20: 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
df30: 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
df40: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
df50: 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
df60: 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
df70: 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
df80: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
df90: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
dfa0: 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
dfb0: 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
dfc0: 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
dfd0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
dfe0: 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
dff0: 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
e000: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
e010: 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
e020: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
e030: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
e040: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e050: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
e060: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
e070: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
e080: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
e090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
e0a0: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
e0b0: 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
e0c0: 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
e0d0: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
e0e0: 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
e0f0: 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
e100: 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
e110: 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
e120: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
e130: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e140: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
e150: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
e160: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
e170: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
e180: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
e190: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e1a0: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
e1b0: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
e1c0: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
e1d0: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
e1e0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
e1f0: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
e200: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
e210: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
e220: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
e230: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
e240: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
e250: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
e260: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
e270: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
e280: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
e290: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
e2a0: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
e2b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
e2c0: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
e2d0: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
e2e0: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
e2f0: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
e300: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
e310: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
e320: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
e330: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
e340: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
e350: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
e360: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
e370: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
e380: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
e390: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
e3a0: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
e3b0: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
e3c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e3d0: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
e3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e3f0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
e400: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e410: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
e420: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e430: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
e440: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e450: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
e460: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e470: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
e480: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
e490: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
e4a0: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
e4b0: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
e4c0: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
e4d0: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
e4e0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
e4f0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
e500: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
e510: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
e520: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e530: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
e540: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
e550: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
e560: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
e570: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
e580: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e590: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
e5a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
e5b0: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
e5c0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
e5d0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
e5e0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
e5f0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
e600: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
e610: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
e620: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
e630: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
e640: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
e650: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
e660: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
e670: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
e680: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
e690: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
e6a0: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
e6b0: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
e6c0: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
e6d0: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
e6e0: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
e6f0: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
e700: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
e710: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
e720: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
e730: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
e740: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
e750: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
e760: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
e770: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
e780: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
e790: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
e7a0: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
e7b0: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
e7c0: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
e7d0: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
e7e0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
e7f0: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
e800: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
e810: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e820: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
e830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
e840: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e850: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
e860: 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
e870: 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
e880: 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
e890: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
e8a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e8b0: 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
e8c0: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
e8d0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
e8e0: 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
e8f0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
e900: 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
e910: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
e920: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
e930: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
e940: 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
e950: 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
e960: 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
e970: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e980: 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
e990: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
e9a0: 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
e9b0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
e9c0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
e9d0: 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
e9e0: 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
e9f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
ea00: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
ea10: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
ea20: 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
ea30: 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
ea40: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
ea50: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
ea60: 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
ea70: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
ea80: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
ea90: 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
eaa0: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
eab0: 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
eac0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
ead0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  */.  if( pBt->in
eae0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
eaf0: 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c  NS_WRITE && wrfl
eb00: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
eb10: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
eb20: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
eb30: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
eb40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
eb50: 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72  D_CACHE.  if( wr
eb60: 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
eb70: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
eb80: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
eb90: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
eba0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
ebb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
ebc0: 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
ebd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ebe0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
ebf0: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
ec00: 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gun;.      }.   
ec10: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
ec20: 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
ec30: 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
ec40: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
ec50: 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
ec60: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68  (pBt);.      }wh
ec70: 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
ec80: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
ec90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  E_OK );.    }.. 
eca0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ecb0: 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
ecc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
ecd0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
ece0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ecf0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
ed00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ed20: 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
ed30: 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
ed40: 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
ed50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ed60: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
ed70: 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
ed80: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
ed90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eda0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
edb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
edc0: 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
edd0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
ede0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
edf0: 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
ee00: 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
ee10: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
ee20: 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
ee30: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
ee40: 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
ee50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
ee60: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ee70: 6e 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b  ndler(pBt, 0) );
ee80: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
ee90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
eea0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
eeb0: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
eec0: 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
eed0: 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
eee0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
eef0: 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
ef00: 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
ef10: 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
ef20: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
ef30: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
ef40: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ef50: 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
ef60: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ef70: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ef80: 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
ef90: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61  lag>1 ){.      a
efa0: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78  ssert( !pBt->pEx
efb0: 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20  clusive );.     
efc0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
efd0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = p;.    }.#end
efe0: 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
eff0: 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74  egun:.  btreeInt
f000: 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
f010: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
f020: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f030: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f040: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f050: 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
f060: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
f070: 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
f080: 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
f090: 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
f0a0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
f0b0: 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
f0c0: 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
f0d0: 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
f0e0: 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
f0f0: 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
f100: 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
f110: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
f120: 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
f130: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
f140: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
f170: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
f180: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f1b0: 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
f1c0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f1f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f200: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f210: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
f220: 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
f230: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
f240: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
f250: 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
f260: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f270: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f280: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
f290: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f2a0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
f2b0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
f2c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f2d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
f2e0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f2f0: 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
f300: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
f310: 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
f320: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f330: 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
f340: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
f350: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
f360: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
f370: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
f380: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f390: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f3a0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f3b0: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
f3c0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
f3d0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
f3e0: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
f3f0: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
f400: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
f410: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
f420: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
f430: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
f440: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f450: 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69  K ) goto set_chi
f460: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
f470: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
f480: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
f490: 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
f4a0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
f4b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
f4c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
f4d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  );.    rc = ptrm
f4e0: 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
f4f0: 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
f500: 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  EE, pgno);.  }..
f510: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f520: 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
f530: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
f540: 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
f550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
f560: 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77  here on pPage, w
f570: 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65  hich is guarente
f580: 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65  ed to be a btree
f590: 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76   page, not an ov
f5a0: 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20  erflow.** page, 
f5b0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f5c0: 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69  page iFrom. Modi
f5d0: 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
f5e0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
f5f0: 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72  s to.** iTo. Par
f600: 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
f610: 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
f620: 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65  of pointer to be
f630: 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a   modified, as .*
f640: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
f650: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
f660: 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
f670: 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
f680: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
f690: 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
f6b0: 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
f6c0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
f6d0: 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
f6e0: 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
f6f0: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
f700: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
f730: 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
f740: 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
f750: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
f760: 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
f770: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
f780: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
f790: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
f7a0: 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
f7b0: 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
f7c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
f7d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f7e0: 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
f7f0: 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
f800: 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
f810: 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
f820: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
f830: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f840: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f850: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ex) );.  if( eTy
f860: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
f870: 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
f880: 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
f890: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
f8a0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
f8b0: 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
f8c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
f8d0: 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
f8e0: 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
f8f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f900: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f910: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
f920: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
f930: 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
f940: 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
f950: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
f960: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
f970: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
f980: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
f990: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
f9a0: 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
f9b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f9c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
f9d0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f9e0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f9f0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
fa00: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
fa10: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
fa20: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
fa30: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
fa40: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
fa50: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
fa60: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
fa70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
fa80: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
fa90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
faa0: 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
fab0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
fac0: 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
fad0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
fae0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
faf0: 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
fb00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fb10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fb20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
fb30: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
fb40: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
fb50: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
fb60: 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
fb70: 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
fb80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fb90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fba0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
fbb0: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
fbc0: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
fbd0: 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
fbe0: 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
fbf0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
fc00: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
fc10: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
fc20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
fc40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
fc50: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
fc60: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
fc70: 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
fc80: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
fc90: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
fca0: 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
fcb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fcc0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
fcd0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
fce0: 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
fcf0: 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
fd00: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
fd10: 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
fd20: 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
fd30: 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
fd40: 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
fd50: 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
fd60: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
fd70: 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
fd80: 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
fd90: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
fda0: 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
fdb0: 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
fde0: 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
fdf0: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
fe00: 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
fe10: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
fe20: 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
fe30: 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
fe40: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
fe50: 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
fe60: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
fe70: 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
fe80: 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
fe90: 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
fea0: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
feb0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
fec0: 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
fed0: 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
fee0: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
fef0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
ff00: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
ff10: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
ff20: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
ff30: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
ff40: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
ff50: 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
ff60: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
ff70: 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
ff80: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
ff90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ffa0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
ffb0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
ffc0: 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
ffd0: 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
ffe0: 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
fff0: 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
10000 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
10010 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
10020 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
10030 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
10040 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
10050 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
10060 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
10070 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
10080 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
10090 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
100a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
100b0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
100c0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
100d0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
100e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
100f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10100 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
10110 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
10120 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
10130 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
10140 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
10150 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
10160 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
10170 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
10180 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
10190 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
101a0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
101b0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
101c0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
101d0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
101e0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
101f0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
10200 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
10210 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
10220 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
10230 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
10240 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
10250 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
10260 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
10270 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
10280 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
10290 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
102a0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
102b0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
102c0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
102d0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
102e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
102f0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
10300 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
10310 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
10320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10330 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10340 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
10350 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
10360 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
10370 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
10380 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
10390 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
103a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
103b0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
103c0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
103d0 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
103e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
103f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
10400 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10410 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
10420 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
10430 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
10440 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
10450 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
10460 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
10470 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
10480 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
10490 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
104a0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
104b0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
104c0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
104d0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
104e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
104f0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10500 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
10510 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
10520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10530 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10540 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
10550 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10560 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
10570 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
10580 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10590 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
105a0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
105b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
105c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
105d0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
105e0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
105f0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
10600 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
10610 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
10620 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10640 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
10650 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
10660 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
10670 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
10680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
10690 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
106a0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
106b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
106c0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20  .  int nPage;.  
106d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
106e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
106f0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72 65  r, &nPage);.  re
10700 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
10710 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d  _OK?nPage:-1);.}
10720 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
10730 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
10740 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
10750 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
10760 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
10770 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
10780 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
10790 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
107a0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
107b0 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
107c0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
107d0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
107e0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
107f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
10800 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
10810 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
10820 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
10830 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
10840 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
10850 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
10860 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
10870 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
10880 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
10890 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
108a0 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
108b0 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
108c0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
108d0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
108e0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
108f0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
10900 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
10910 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
10920 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
10930 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
10940 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
10950 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
10960 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
10970 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
10980 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
10990 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
109a0 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
109b0 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
109c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
109d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
109e0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
109f0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
10a00 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
10a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
10a30 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
10a40 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
10a50 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
10a60 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
10a70 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
10a80 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
10a90 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
10aa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
10ab0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
10ac0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
10ad0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10ae0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10af0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c  ->mutex) );.  iL
10b00 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72  astPg = pBt->nTr
10b10 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74  unc;.  if( iLast
10b20 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  Pg==0 ){.    iLa
10b30 73 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65  stPg = pagerPage
10b40 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10b50 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
10b60 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10b70 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
10b80 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
10b90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
10ba0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
10bb0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
10bc0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
10bd0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
10be0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
10bf0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
10c00 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
10c10 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d  List==0 || nFin=
10c20 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20  =iLastPg ){.    
10c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c40 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10c50 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
10c60 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
10c70 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
10c80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10cb0 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
10cc0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
10cd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10ce0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10cf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
10d00 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10d10 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
10d20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
10d30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
10d40 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
10d50 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
10d60 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
10d70 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
10d80 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
10d90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
10da0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
10db0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
10dc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
10dd0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
10de0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
10df0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
10e00 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
10e10 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
10e20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
10e30 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
10e40 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
10e50 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
10e60 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
10e70 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
10e80 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
10e90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10ea0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
10eb0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
10ec0 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
10ed0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10ee0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10f00 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
10f10 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
10f20 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
10f30 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
10f40 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
10f50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10f60 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
10f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10f80 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
10f90 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
10fa0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
10fb0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
10fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10fd0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
10fe0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
10ff0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
11000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
11020 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
11030 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
11040 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
11050 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
11060 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
11070 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
11080 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
11090 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
110a0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
110b0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
110c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
110d0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
110e0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
110f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
11100 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
11110 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
11120 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
11130 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
11140 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
11150 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
11160 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
11170 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
11180 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
11190 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
111a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
111b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
111c0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
111d0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
111e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
111f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11200 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
11210 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
11220 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11240 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11250 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
11260 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
11270 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
11280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11290 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
112a0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
112b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
112c0 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
112d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
112e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
112f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
11300 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
11310 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
11320 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
11330 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
11340 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
11350 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
11360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11390 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
113a0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c  pBt->nTrunc = iL
113b0 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69  astPg - 1;.  whi
113c0 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  le( pBt->nTrunc=
113d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
113e0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
113f0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
11400 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20  >nTrunc) ){.    
11410 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20  pBt->nTrunc--;. 
11420 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11430 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11440 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
11450 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
11460 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
11470 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
11480 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
11490 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
114a0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
114b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
114c0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
114d0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
114e0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
114f0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
11500 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
11510 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
11520 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
11530 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
11540 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
11550 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  cured,.** SQLITE
11560 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11570 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
11580 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
11590 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
115a0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
115b0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
115c0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
115d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
115e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
115f0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
11600 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
11610 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
11620 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11630 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
11640 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
11650 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
11660 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
11680 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
11690 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
116a0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
116b0 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
116c0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29  cuumStep(pBt, 0)
116d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
116e0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
116f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11700 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11710 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
11720 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
11730 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
11740 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11750 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
11760 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
11770 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
11780 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11790 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
117a0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
117b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
117c0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
117d0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
117e0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
117f0 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
11800 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
11810 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
11820 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
11830 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
11840 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
11850 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
11860 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
11870 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
11880 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
11890 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54   *pBt, Pgno *pnT
118a0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
118b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
118c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
118d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e  Bt->pPager;.#ifn
118e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
118f0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
11900 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
11910 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
11920 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11930 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11940 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
11950 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
11960 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
11970 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
11980 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
11990 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
119a0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  {.    Pgno nFin 
119b0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42  = 0;..    if( pB
119c0 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a  t->nTrunc==0 ){.
119d0 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65        Pgno nFree
119e0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74  ;.      Pgno nPt
119f0 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73  rmap;.      cons
11a00 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
11a10 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
11a20 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61    int nOrig = pa
11a30 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
11a40 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  ->pPager);..    
11a50 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
11a60 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
11a70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11a80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11a90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
11aa0 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d       if( nOrig==
11ab0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
11ac0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
11ad0 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20    nOrig--;.     
11ae0 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d   }.      nFree =
11af0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
11b00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11b10 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61  ]);.      nPtrma
11b20 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
11b30 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
11b40 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f  Bt, nOrig)+pgsz/
11b50 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20  5)/(pgsz/5);.   
11b60 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
11b70 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
11b80 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  p;.      if( nOr
11b90 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
11ba0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
11bb0 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n<=PENDING_BYTE_
11bc0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11bd0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11be0 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
11bf0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
11c00 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
11c10 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
11c20 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
11c30 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
11c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11c50 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
11c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11c70 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
11c80 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20  ep(pBt, nFin);. 
11c90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11ca0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
11cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69        assert(nFi
11cc0 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72  n==0 || pBt->nTr
11cd0 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d  unc==0 || nFin<=
11ce0 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20  pBt->nTrunc);.  
11cf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11d00 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  OK;.      if( pB
11d10 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69  t->nTrunc && nFi
11d20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
11d30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
11d40 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
11d50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
11d60 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
11d70 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11d80 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  32], 0);.       
11d90 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11da0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11db0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11dc0 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69  Bt->nTrunc = nFi
11dd0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11de0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11df0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11e00 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
11e10 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
11e20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
11e30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11e40 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70      *pnTrunc = p
11e50 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20  Bt->nTrunc;.    
11e60 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
11e70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
11e80 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
11e90 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
11ea0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
11eb0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
11ec0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11ed0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
11ee0 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
11ef0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
11f00 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
11f10 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
11f20 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
11f30 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
11f40 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
11f50 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
11f60 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
11f70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
11f80 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
11f90 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
11fa0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
11fb0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
11fc0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11fd0 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
11fe0 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
11ff0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
12000 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
12010 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
12020 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
12030 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
12040 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
12050 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
12060 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
12070 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
12080 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
12090 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
120a0 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
120b0 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
120c0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
120d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
120e0 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
120f0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
12100 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
12110 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
12120 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
12130 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
12140 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
12150 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
12160 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
12170 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
12180 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
12190 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
121a0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
121b0 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
121c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
121d0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
121e0 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
121f0 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
12200 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
12210 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
12220 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
12230 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
12240 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12250 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
12260 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12270 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
12280 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
12290 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
122a0 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
122b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
122c0 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
122d0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
122e0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
122f0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12300 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12310 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
12320 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
12330 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
12340 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
12350 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
12360 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12370 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
12380 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
12390 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
123a0 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
123b0 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
123c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
123d0 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
123e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
123f0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12400 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
12410 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12420 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12440 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12460 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12470 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12480 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12490 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
124a0 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
124b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
124c0 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
124d0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66  >db = p->db;.#if
124e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
124f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
12500 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
12510 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
12520 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
12530 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
12540 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
12550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12560 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12570 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12580 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
125a0 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
125b0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
125c0 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
125d0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
125e0 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  runc, 0);.    sq
125f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12600 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
12610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
12620 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
12630 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
12640 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
12650 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12660 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
12670 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
12680 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
12690 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
126a0 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
126b0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
126c0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
126d0 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
126e0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
126f0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
12700 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
12710 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
12720 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
12730 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
12740 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
12750 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
12760 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
12770 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
12780 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
12790 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
127a0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
127b0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
127c0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
127d0 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
127e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
127f0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
12800 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
12810 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
12820 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
12830 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
12840 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
12850 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
12860 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
12870 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
12880 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
12890 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
128a0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
128b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
128c0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
128d0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
128e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
128f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12900 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
12910 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
12920 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
12930 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
12940 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
12950 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
12960 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
12970 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
12980 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12990 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
129a0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
129b0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
129c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
129d0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
129e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
129f0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
12a00 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
12a10 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
12a20 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
12a30 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
12a40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12a50 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
12a60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12a90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12aa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12ab0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
12ac0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
12ad0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
12ae0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
12af0 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
12b00 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
12b10 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
12b20 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
12b30 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
12b40 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
12b50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
12b60 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
12b70 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
12b80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12b90 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
12ba0 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
12bb0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
12bc0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
12bd0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12be0 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
12bf0 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
12c00 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
12c10 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
12c20 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
12c30 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
12c40 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
12c50 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
12c60 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
12c70 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12c80 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
12c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12ca0 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
12cb0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
12cc0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
12cd0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
12ce0 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
12cf0 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
12d00 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
12d10 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
12d20 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
12d30 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
12d40 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
12d50 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12d60 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
12d70 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
12d80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12d90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12da0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12db0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
12dc0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
12dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12de0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
12df0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12e00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12e10 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
12e20 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12e30 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
12e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12e50 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
12e60 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12e70 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
12e80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12e90 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12ea0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
12eb0 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
12ec0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
12ed0 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
12ee0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
12ef0 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
12f00 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
12f10 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
12f20 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
12f30 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
12f40 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
12f50 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
12f60 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
12f70 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
12f80 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
12f90 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
12fa0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
12fb0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
12fc0 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
12fd0 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
12fe0 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
12ff0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
13000 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
13010 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
13020 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
13030 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
13040 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
13050 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
13060 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
13070 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
13080 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
13090 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
130a0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
130b0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
130c0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
130d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
130e0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
130f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
13100 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
13110 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
13120 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
13130 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13140 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
13150 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
13160 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
13170 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
13180 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
13190 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
131a0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
131b0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
131c0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
131d0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
131e0 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
131f0 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
13200 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
13210 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
13220 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
13230 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
13240 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
13250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13260 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
13270 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13280 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
13290 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
132a0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
132b0 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
132c0 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
132d0 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
132e0 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
132f0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
13300 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13310 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
13320 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
13330 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
13340 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
13350 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
13360 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
13370 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
13380 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
13390 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
133a0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
133b0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
133c0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
133d0 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
133e0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
133f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
13400 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
13410 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
13420 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
13430 78 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75  xt){.    clearCu
13440 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
13450 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
13460 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
13470 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72     p->skip = err
13480 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Code;.  }.  sqli
13490 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
134a0 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
134b0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
134c0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
134d0 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
134e0 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
134f0 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
13500 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
13510 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
13520 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
13530 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
13540 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
13550 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
13560 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
13570 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
13580 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
13590 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
135a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
135b0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
135c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
135d0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
135e0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
135f0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
13600 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
13610 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a  back(Btree *p){.
13620 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
13630 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13640 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
13650 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
13660 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13670 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
13680 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  b;.  rc = saveAl
13690 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
136a0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
136b0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
136c0 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
136d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
136e0 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
136f0 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
13700 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
13710 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65  c() error occure
13720 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
13730 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
13740 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
13750 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
13760 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
13770 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
13780 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
13790 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
137a0 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
137b0 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
137c0 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
137d0 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
137e0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
137f0 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
13800 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
13810 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
13820 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
13830 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
13840 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
13850 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
13860 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
13870 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
13880 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
13890 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
138a0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
138b0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
138c0 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
138d0 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
138e0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75  ntegrity(p);.  u
138f0 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70  nlockAllTables(p
13900 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
13910 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
13920 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
13930 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13940 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13950 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  M.    pBt->nTrun
13960 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
13970 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
13980 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
13990 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
139a0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
139b0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
139c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
139d0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
139e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
139f0 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
13a00 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
13a10 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
13a20 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
13a30 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
13a40 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69      ** call sqli
13a50 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
13a60 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
13a70 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
13a80 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
13a90 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
13aa0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
13ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13ac0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
13ad0 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
13ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
13af0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13b10 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
13b20 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
13b30 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
13b40 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
13b50 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  READ;.  }..  if(
13b60 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
13b70 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61  NS_NONE ){.    a
13b80 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
13b90 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
13ba0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
13bb0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30  ion--;.    if( 0
13bc0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
13bd0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
13be0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
13bf0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
13c00 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e    }.  }..  p->in
13c10 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
13c20 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  NE;.  pBt->inStm
13c30 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42  t = 0;.  unlockB
13c40 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
13c50 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
13c60 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
13c70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13c80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13c90 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
13ca0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13cb0 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75  saction.  The su
13cc0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
13cd0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
13ce0 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  d back independe
13cf0 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
13d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
13d10 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
13d20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
13d30 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
13d40 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  subtransaction..
13d50 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  ** The subtransa
13d60 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
13d70 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20  utomatically if 
13d80 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
13d90 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20  tion.** commits 
13da0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
13db0 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75  *.** Only one su
13dc0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79  btransaction may
13dd0 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20   be active at a 
13de0 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20  time.  It is an 
13df0 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20  error to try.** 
13e00 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
13e10 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  ubtransaction if
13e20 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e   another subtran
13e30 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
13e40 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  dy active..**.**
13e50 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
13e60 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
13e70 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
13e80 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
13e90 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
13ea0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
13eb0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
13ec0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
13ed0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
13ee0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
13ef0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
13f00 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
13f10 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
13f20 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
13f30 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
13f40 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
13f50 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
13f60 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
13f70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
13f80 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
13f90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
13fa0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13fb0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
13fc0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13fd0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13fe0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72  ;.  if( (p->inTr
13ff0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
14000 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ) || pBt->inStmt
14010 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
14020 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
14030 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
14040 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
14050 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14060 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
14070 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
14080 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42  E );.    rc = pB
14090 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
140a0 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
140b0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
140c0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
140d0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
140e0 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
140f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14100 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
14110 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
14120 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61   statment subtra
14130 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
14140 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  ly in progress. 
14150 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61   If no.** subtra
14160 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14170 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ve, this is a no
14180 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
14190 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
141a0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
141b0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
141c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
141d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
141e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
141f0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
14200 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
14210 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
14220 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14230 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
14240 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
14250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
14260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14270 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74   }.  pBt->inStmt
14280 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
14290 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
142a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
142b0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
142c0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
142d0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
142e0 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e  .  If no subtran
142f0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63  saction.** is ac
14300 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e  tive this routin
14310 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
14320 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
14330 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
14340 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ted by this oper
14350 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
14360 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20  mpt.** to use a 
14370 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20  cursor that was 
14380 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
14390 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
143a0 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  eration.** will 
143b0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
143c0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
143d0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
143e0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
143f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14400 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
14410 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14420 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14430 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
14440 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
14450 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21  pBt->inStmt && !
14460 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
14470 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14480 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
14490 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
144a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
144b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
144c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
144d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
144e0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
144f0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
14500 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
14510 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
14520 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
14530 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
14540 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
14550 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
14560 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
14570 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
14580 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
14590 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
145a0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
145b0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
145c0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
145d0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
145e0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
145f0 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
14600 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
14610 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
14620 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
14630 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
14640 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
14650 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
14660 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14670 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14680 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
14690 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
146a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
146b0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
146c0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
146d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
146e0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
146f0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
14700 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
14710 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
14720 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
14730 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
14740 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
14750 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
14760 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14770 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14780 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
14790 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
147a0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
147b0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
147c0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
147d0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
147e0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
147f0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14800 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
14810 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
14820 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
14830 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
14840 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
14850 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
14860 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14870 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14880 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
14890 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
148a0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
148b0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
148c0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
148d0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
148e0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
148f0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
14900 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
14910 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
14920 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
14930 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
14940 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14970 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
149a0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
149b0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
149c0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
149f0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14a00 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
14a10 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
14a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14a30 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
14a40 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
14a50 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14a60 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
14a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
14a80 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
14a90 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
14aa0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14ab0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
14ac0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
14ad0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
14ae0 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
14af0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
14b00 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14b20 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
14b30 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
14b40 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
14b50 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
14b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b70 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
14b80 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
14b90 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
14ba0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
14bb0 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
14bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14bd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14be0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
14bf0 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
14c00 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20   && wrFlag ){.  
14c10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14c20 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14c30 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67  }.  }.  pCur->pg
14c40 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
14c50 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61  Table;.  if( iTa
14c60 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50  ble==1 && pagerP
14c70 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
14c80 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
14c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
14ca0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
14cb0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
14cc0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
14cd0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
14ce0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
14cf0 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
14d00 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
14d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
14d30 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
14d40 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
14d50 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
14d60 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
14d70 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
14d80 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
14d90 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b   variables, link
14da0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
14db0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
14dc0 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75  st and set *ppCu
14dd0 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70  r (the.  ** outp
14de0 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ut argument to t
14df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20  his function).. 
14e00 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79   */.  pCur->pKey
14e10 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
14e20 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
14e30 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
14e40 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
14e50 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
14e60 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
14e70 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
14e80 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14e90 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
14ea0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
14eb0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
14ec0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
14ed0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
14ee0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a  URSOR_INVALID;..
14ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f00 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73  OK;..create_curs
14f10 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
14f20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
14f30 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f  ->pPage);.  unlo
14f40 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
14f50 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pBt);.  return r
14f60 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
14f70 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
14f80 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14fb0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
14fc0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
14ff0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
15000 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
15010 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
15040 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
15050 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
15060 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15080 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
15090 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
150a0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
150b0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
150e0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
150f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
15100 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15110 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
15120 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
15130 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
15140 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
15150 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
15160 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15170 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15180 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
15190 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
151a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65  ){.  return size
151b0 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a  of(BtCursor);.}.
151c0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  .../*.** Close a
151d0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
151e0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
151f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
15200 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
15210 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
15220 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
15230 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15240 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
15250 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
15260 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
15270 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
15280 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
15290 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
152a0 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
152b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
152c0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42  (pBtree);.    pB
152d0 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  t->db = pBtree->
152e0 64 62 3b 0a 20 20 20 20 63 6c 65 61 72 43 75 72  db;.    clearCur
152f0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
15300 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
15310 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
15320 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
15330 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
15340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15350 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
15360 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
15370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
15380 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
15390 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
153a0 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
153b0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ev;.    }.    re
153c0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
153d0 70 50 61 67 65 29 3b 0a 20 20 20 20 75 6e 6c 6f  pPage);.    unlo
153e0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
153f0 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  pBt);.    invali
15400 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
15410 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20  e(pCur);.    /* 
15420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
15430 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
15440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
15450 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
15460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15470 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65  ./*.** Make a te
15480 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62  mporary cursor b
15490 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  y filling in the
154a0 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70   fields of pTemp
154b0 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70  Cur..** The temp
154c0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20  orary cursor is 
154d0 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  not on the curso
154e0 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42  r list for the B
154f0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
15500 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d  lite3BtreeGetTem
15510 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
15520 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72   *pCur, BtCursor
15530 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 61   *pTempCur){.  a
15540 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
15550 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
15560 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43  .  memcpy(pTempC
15570 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66  ur, pCur, sizeof
15580 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d  (*pCur));.  pTem
15590 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pCur->pNext = 0;
155a0 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72  .  pTempCur->pPr
155b0 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54  ev = 0;.  if( pT
155c0 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  empCur->pPage ){
155d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
155e0 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70  rRef(pTempCur->p
155f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
15600 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
15610 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ete a temporary 
15620 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77  cursor such as w
15630 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43  as made by the C
15640 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75  reateTemporaryCu
15650 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rsor().** functi
15660 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69  on above..*/.voi
15670 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  d sqlite3BtreeRe
15680 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
15690 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
156a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
156b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
156c0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
156d0 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71  >pPage ){.    sq
156e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
156f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62  pCur->pPage->pDb
15700 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
15710 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15720 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
15730 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
15740 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
15750 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
15760 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
15770 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
15780 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73  valid, call.** s
15790 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
157a0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
157b0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
157c0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
157d0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
157e0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
157f0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
15800 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
15810 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
15820 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
15830 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15840 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32  eCell()..**.** 2
15850 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72  007-06-25:  Ther
15860 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f  e is a bug in so
15870 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d  me versions of M
15880 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74  SVC that cause t
15890 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74  he.** compiler t
158a0 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74  o crash when get
158b0 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d  CellInfo() is im
158c0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d  plemented as a m
158d0 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65  acro..** But the
158e0 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61  re is a measurea
158f0 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74  ble speed advant
15900 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65  age to using the
15910 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a   macro on gcc.**
15920 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70   (when less comp
15930 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  iler optimizatio
15940 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d  ns like -Os or -
15950 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20  O0 are used and 
15960 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
15970 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72  is not doing agr
15980 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e  essive inlining.
15990 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72  )  So we use a r
159a0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eal function.** 
159b0 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d  for MSVC and a m
159c0 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68  acro for everyth
159d0 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65  ing else.  Ticke
159e0 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e  t #2457..*/.#ifn
159f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
15a00 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
15a10 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
15a20 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
15a30 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
15a40 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
15a50 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
15a60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15a70 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
15a80 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15a90 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
15aa0 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
15ab0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
15ac0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
15ad0 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
15ae0 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
15af0 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
15b00 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
15b10 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
15b20 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
15b30 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
15b40 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
15b50 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
15b60 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
15b70 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
15b80 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
15b90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
15ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
15bb0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15bc0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
15bd0 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d  Cur->idx, &pCur-
15be0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
15bf0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
15c00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
15c10 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
15c20 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
15c30 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
15c40 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
15c50 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
15c60 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
15c70 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
15c80 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
15c90 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
15ca0 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
15cb0 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
15cf0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
15d00 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15d30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
15d40 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
15d50 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
15d60 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20   &pCur->info);  
15d70 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75         \.    pCu
15d80 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
15d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
15e10 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15e20 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
15e60 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
15e70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
15e80 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
15e90 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
15ea0 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
15eb0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
15ec0 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
15ed0 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
15ee0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
15ef0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
15f00 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
15f10 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15f20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
15f30 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
15f40 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
15f50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
15f60 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
15f70 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
15f80 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
15f90 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
15fa0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
15fb0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
15fc0 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
15fd0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
15fe0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15ff0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
16000 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
16010 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
16020 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
16030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16040 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
16050 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
16060 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
16070 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
16080 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
16090 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
160a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
160b0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
160c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
160d0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
160e0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
160f0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
16100 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
16110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16120 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
16130 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
16140 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
16150 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
16160 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
16170 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
16180 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   Always return S
16190 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69  QLITE_OK..** Fai
161a0 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
161b0 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75  ible.  If the cu
161c0 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
161d0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
161e0 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77  g to an entry (w
161f0 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c  hich can happen,
16200 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
16210 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16220 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20   is empty) then 
16230 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
16240 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
16250 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
16260 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
16270 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  u32 *pSize){.  i
16280 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16290 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
162a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
162b0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
162c0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
162d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
162e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
162f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
16300 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16310 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
16320 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
16330 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
16340 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
16350 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
16360 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
16370 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
16380 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
16390 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
163a0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
163b0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
163c0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
163d0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
163e0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
163f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
16410 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
16420 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
16430 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
16440 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
16450 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
16460 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
16470 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16480 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
16490 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
164a0 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
164b0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
164c0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
164d0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
164e0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
164f0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
16500 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
16510 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
16520 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
16530 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16540 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
16550 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
16560 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
16570 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50  .**.** Unless pP
16580 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c  gnoNext is NULL,
16590 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
165a0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
165b0 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69  rflow .** page i
165c0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
165d0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
165e0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
165f0 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74  age ovfl.** is t
16600 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
16610 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c  its linked list,
16620 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
16630 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
16640 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
16650 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67  not NULL, *ppPag
16660 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
16670 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a  MemPage* handle.
16680 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c  ** for page ovfl
16690 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  . The underlying
166a0 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20   pager page may 
166b0 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
166c0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
166d0 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73  noContent flag s
166e0 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20  et, so the page 
166f0 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20  data accessable 
16700 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64  via.** this hand
16710 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  le may not be tr
16720 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  usted..*/.static
16730 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
16740 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
16750 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f   *pBt, .  Pgno o
16760 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
16770 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c         /* Overfl
16780 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  ow page */.  Mem
16790 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
167a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
167b0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
167c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
167d0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
167e0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
167f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
16800 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
16810 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e  o next = 0;.  in
16820 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16830 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16840 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16850 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  );.  /* One of t
16860 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  hese must not be
16870 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
16880 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20  , why call this 
16890 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61  function? */.  a
168a0 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20  ssert(ppPage || 
168b0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f  pPgnoNext);..  /
168c0 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69  * If pPgnoNext i
168d0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
168e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
168f0 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62  ing called to ob
16900 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50  tain.  ** a MemP
16910 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f  age* reference o
16920 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74  nly. No page-dat
16930 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  a is required in
16940 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f   this case..  */
16950 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78  .  if( !pPgnoNex
16960 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16970 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16980 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70  age(pBt, ovfl, p
16990 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a  pPage, 1);.  }..
169a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
169b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
169c0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
169d0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
169e0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
169f0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
16a00 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
16a10 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
16a20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
16a30 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
16a40 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
16a50 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
16a60 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
16a70 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
16a80 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
16a90 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
16aa0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
16ab0 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
16ac0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
16ad0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
16ae0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
16af0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
16b00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
16b10 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
16b20 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
16b30 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
16b40 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
16b50 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
16b60 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
16b70 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
16b80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
16b90 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
16ba0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
16bb0 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72  f( iGuess<=pager
16bc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
16bd0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
16be0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
16bf0 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
16c00 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
16c10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16c30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16c40 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  }.      if( eTyp
16c50 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16c60 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
16c70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
16c80 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
16c90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
16ca0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74  ndif..  if( next
16cb0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b  ==0 || ppPage ){
16cc0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
16cd0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  age = 0;..    rc
16ce0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
16cf0 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
16d00 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d  , &pPage, next!=
16d10 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72  0);.    assert(r
16d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
16d30 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69  pPage==0);.    i
16d40 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63  f( next==0 && rc
16d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d60 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
16d70 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
16d80 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  a);.    }..    i
16d90 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
16da0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
16db0 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ge;.    }else{. 
16dc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16dd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
16de0 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20   }.  *pPgnoNext 
16df0 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72  = next;..  retur
16e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
16e10 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
16e20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
16e30 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
16e40 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
16e50 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
16e60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
16e70 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
16e80 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
16e90 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
16ea0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
16eb0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
16ec0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
16ed0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
16ee0 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
16ef0 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
16f00 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
16f10 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
16f20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16f30 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
16f40 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
16f50 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
16f60 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
16f70 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
16f80 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
16f90 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
16fa0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
16fb0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
16fc0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
16fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
16fe0 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
16ff0 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
17000 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
17010 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
17020 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17040 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
17050 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
17060 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17080 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
17090 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170b0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
170c0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
170d0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
170e0 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
170f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
17100 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
17110 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
17120 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
17130 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
17140 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
17150 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
17160 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
17170 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17180 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
17190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
171a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
171b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
171c0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
171d0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
171e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
171f0 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
17200 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
17210 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
17220 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
17230 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
17240 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
17250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17260 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17270 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
17280 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
17290 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
172a0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
172b0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
172c0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
172d0 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
172e0 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
172f0 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
17300 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
17310 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
17320 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
17330 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
17340 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
17350 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
17360 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17370 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
17380 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
17390 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
173a0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
173b0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
173c0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
173d0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
173e0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
173f0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
17400 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
17410 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
17420 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
17430 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
17440 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
17450 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
17460 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
17470 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
17480 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
17490 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
174a0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
174b0 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
174c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
174d0 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
174e0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
174f0 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
17500 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
17510 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
17520 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
17530 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
17540 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
17550 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
17560 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
17570 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
17580 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
17590 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
175a0 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
175b0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
175c0 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
175d0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
175e0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
175f0 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
17600 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
17610 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17620 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
17630 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
17640 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
17650 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
17660 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
17670 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
17680 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
17690 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
176a0 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
176b0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
176c0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
176d0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
176e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
176f0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
17700 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
17710 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
17720 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
17730 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
17740 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
17750 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
17760 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
17770 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
17780 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
17790 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
177a0 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
177b0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
177c0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
177d0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
177e0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
177f0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
17800 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
17810 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  t offset,       
17820 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
17830 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
17840 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  o payload */.  i
17850 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
17860 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
17870 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
17880 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17890 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
178a0 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
178b0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
178c0 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
178d0 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
178e0 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
178f0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
17900 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
17910 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
17920 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
17930 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
17940 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
17950 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
17960 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17970 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
17980 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
17990 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
179a0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20  = pCur->pPage;  
179b0 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65     /* Btree page
179c0 20 6f 66 20 63 75 72 72 65 6e 74 20 63 75 72 73   of current curs
179d0 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  or entry */.  Bt
179e0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17a00 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
17a10 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
17a20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
17a30 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
17a40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17a50 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
17a60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
17a70 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
17a80 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
17a90 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
17aa0 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  et>=0 );.  asser
17ab0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
17ac0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
17ad0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
17ae0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
17af0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
17b00 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
17b10 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
17b20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
17b30 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   0 : pCur->info.
17b40 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b  nKey);..  if( sk
17b50 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66  ipKey ){.    off
17b60 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d  set += nKey;.  }
17b70 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
17b80 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
17b90 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20  nfo.nData ){.   
17ba0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
17bb0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
17bc0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17bd0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
17be0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
17bf0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
17c00 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
17c10 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
17c20 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
17c30 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
17c40 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
17c50 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
17c60 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
17c70 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
17c80 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
17c90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17ca0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
17cb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
17cc0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
17cd0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
17ce0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
17cf0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
17d00 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
17d10 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
17d20 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
17d30 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
17d40 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
17d50 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
17d60 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
17d70 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70 43 75 72   }..  pBt = pCur
17d80 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 72 63 3d  ->pBt;.  if( rc=
17d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
17da0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
17db0 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20   int ovflSize = 
17dc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
17dd0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
17de0 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
17df0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
17e00 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
17e10 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
17e20 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
17e30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
17e40 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17e50 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
17e60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
17e70 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
17e80 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
17e90 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
17ea0 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
17eb0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
17ec0 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
17ed0 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
17ee0 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
17ef0 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
17f00 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
17f10 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
17f20 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
17f30 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
17f40 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
17f50 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
17f60 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
17f70 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
17f80 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
17f90 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
17fa0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
17fb0 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
17fc0 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
17fd0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
17fe0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
17ff0 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
18000 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
18010 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
18020 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
18030 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
18040 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
18050 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18060 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
18070 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
18080 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
18090 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
180a0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
180b0 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
180c0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
180d0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
180e0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
180f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
18110 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
18120 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
18130 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
18140 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
18150 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
18160 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
18170 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
18180 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
18190 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
181a0 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
181b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
181c0 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
181d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
181e0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
181f0 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
18200 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
18210 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
18220 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
18230 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
18240 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
18250 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
18260 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
18270 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
18280 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
18290 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
182a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
182b0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
182c0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
182d0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
182e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
182f0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
18300 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
18310 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
18320 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
18330 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
18340 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
18350 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
18360 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
18370 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18380 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
18390 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
183a0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
183b0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
183c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
183d0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
183e0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
183f0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
18400 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
18410 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
18420 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
18430 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
18440 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
18450 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
18460 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
18470 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
18480 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
18490 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
184a0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
184b0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
184c0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
184d0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
184e0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
184f0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
18500 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
18510 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
18520 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
18530 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18540 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
18550 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
18560 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18570 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
18580 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
18590 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
185a0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
185b0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
185c0 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
185d0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
185e0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
185f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
18600 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
18610 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
18620 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
18630 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
18640 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
18650 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
18660 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
18670 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
18680 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
18690 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
186a0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
186b0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
186c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
186d0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
186e0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
186f0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
18700 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18720 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
18730 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
18740 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
18750 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
18760 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
18770 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
18780 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
18790 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
187a0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
187b0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
187c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
187d0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
187e0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
187f0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
18800 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
18810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
18820 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
18830 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18840 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
18850 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
18860 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
18870 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
18880 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
18890 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
188a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
188b0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
188c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
188d0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
188e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
188f0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
18900 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
18910 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18920 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18930 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18940 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
18950 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
18960 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
18970 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
18980 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18990 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
189a0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
189b0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
189c0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
189d0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
189e0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
189f0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
18a00 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
18a10 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18a20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
18a30 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
18a40 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
18a50 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
18a60 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
18a70 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
18a80 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
18a90 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
18aa0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
18ab0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
18ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18ad0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18ae0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18af0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
18b00 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18b10 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
18b20 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
18b30 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
18b40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18b50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
18b60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18b70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
18b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18b90 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
18ba0 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
18bb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
18bc0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
18bd0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
18be0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
18bf0 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
18c00 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
18c10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18c20 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
18c30 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
18c40 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
18c50 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
18c60 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
18c70 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18c80 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18c90 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
18ca0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
18cb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
18cc0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18cd0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
18ce0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
18cf0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18d00 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
18d10 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
18d20 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
18d30 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
18d40 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
18d50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18d60 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
18d70 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
18d80 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
18d90 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
18da0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
18db0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
18dc0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
18dd0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
18de0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
18df0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
18e00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
18e10 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
18e20 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18e30 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
18e40 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
18e50 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
18e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
18e70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
18e80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18e90 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
18ea0 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
18eb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18ec0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18ed0 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18ee0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18ef0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
18f00 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18f10 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
18f20 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18f40 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
18f50 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
18f60 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
18f70 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
18f80 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
18f90 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
18fa0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
18fb0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
18fc0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
18fd0 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
18fe0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
18ff0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
19000 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
19010 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
19020 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
19030 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
19040 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
19050 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
19060 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
19070 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19080 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
19090 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
190a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
190b0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
190c0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
190d0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
190e0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
190f0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
19100 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
19110 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
19120 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
19130 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
19140 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
19150 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
19160 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
19170 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
19180 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
19190 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
191a0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
191b0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
191c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
191d0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
191e0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
191f0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a   to reassembly.*
19200 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
19210 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
19220 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
19230 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
19240 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
19250 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
19260 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
19270 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
19280 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
19290 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
192a0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
192b0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
192c0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
192d0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
192e0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
192f0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
19300 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
19310 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
19320 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
19330 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19340 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
19350 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
19360 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
19370 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
19380 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
19390 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
193a0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
193b0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
193c0 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
193d0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
193e0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
193f0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
19400 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19410 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
19420 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  nt nLocal;..  as
19430 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
19440 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
19450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19460 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19470 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
19480 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19490 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
194a0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
194b0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
194c0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
194d0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
194e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
194f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
19500 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
19510 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
19520 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
19530 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
19540 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
19550 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
19560 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
19570 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
19580 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
19590 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
195a0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
195b0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
195c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
195d0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
195e0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
195f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
19600 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
19610 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
19620 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
19630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
19640 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
19650 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
19660 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
19670 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
19680 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
19690 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
196a0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
196b0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
196c0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
196d0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
196e0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
196f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
19700 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
19710 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
19720 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
19730 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
19740 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
19750 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
19760 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
19770 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
19780 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
19790 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
197a0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
197b0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
197c0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
197d0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
197e0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
197f0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
19800 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
19810 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
19820 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
19830 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
19840 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
19850 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
19860 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
19870 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
19880 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
19890 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
198a0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
198b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
198c0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
198d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
198e0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
198f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19900 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
19910 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19920 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
19930 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
19940 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
19950 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
19960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19970 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
19980 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
19990 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
199a0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
199b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
199c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
199d0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
199e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
199f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
19a00 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
19a10 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
19a20 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
19a30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19a40 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
19a50 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
19a60 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
19a70 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
19a80 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
19a90 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
19aa0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
19ab0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
19ac0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19ad0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
19ae0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
19af0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
19b00 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
19b10 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  e;.  MemPage *pO
19b20 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ldPage;.  BtShar
19b30 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
19b40 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
19b50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19b60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19b70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19b80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19b90 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ;.  rc = getAndI
19ba0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
19bb0 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c  Pgno, &pNewPage,
19bc0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
19bd0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19be0 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d   rc;.  pNewPage-
19bf0 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75  >idxParent = pCu
19c00 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61  r->idx;.  pOldPa
19c10 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
19c20 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64  ;.  pOldPage->id
19c30 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65  xShift = 0;.  re
19c40 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61  leasePage(pOldPa
19c50 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
19c60 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  ge = pNewPage;. 
19c70 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
19c80 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
19c90 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
19ca0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
19cb0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
19cc0 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
19cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19ce0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
19cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19d10 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
19d20 67 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61  ge is the virtua
19d30 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61  l root of its ta
19d40 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ble..**.** The v
19d50 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
19d60 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
19d70 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65  e for most table
19d80 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74  s.  But.** for t
19d90 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
19da0 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74  on page 1, somet
19db0 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  ime the real roo
19dc0 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70  t page.** is emp
19dd0 74 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ty except for th
19de0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e  e right-pointer.
19df0 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20    In such cases 
19e00 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  the.** virtual r
19e10 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20  oot page is the 
19e20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69  page that the ri
19e30 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70  ght-pointer of p
19e40 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e  age.** 1 is poin
19e50 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
19e60 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
19e70 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  otPage(MemPage *
19e80 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
19e90 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 61  e *pParent;..  a
19ea0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
19eb0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
19ec0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
19ed0 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67    pParent = pPag
19ee0 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
19ef0 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
19f00 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
19f10 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
19f20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
19f30 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
19f40 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
19f50 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
19f60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
19f70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19f80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19f90 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
19fa0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
19fb0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
19fc0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
19fd0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
19fe0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
19ff0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1a000 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1a010 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1a020 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1a030 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1a040 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1a050 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1a060 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1a070 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1a080 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
1a090 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1a0a0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
1a0b0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
1a0c0 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  age *pParent;.  
1a0d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1a0e0 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b    int idxParent;
1a0f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a100 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a110 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a120 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a130 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a140 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1a150 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
1a160 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
1a170 65 72 74 28 20 21 73 71 6c 69 74 65 33 42 74 72  ert( !sqlite3Btr
1a180 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61  eeIsRootPage(pPa
1a190 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74  ge) );.  pParent
1a1a0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
1a1b0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
1a1c0 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78  rent!=0 );.  idx
1a1d0 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
1a1e0 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  idxParent;.  sql
1a1f0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
1a200 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
1a210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1a220 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
1a230 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  age = pParent;. 
1a240 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a250 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1a260 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1a270 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1a280 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a  >idxShift==0 );.
1a290 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64    pCur->idx = id
1a2a0 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xParent;.}../*.*
1a2b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a2c0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1a2d0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1a2e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1a2f0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1a300 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1a310 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a320 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1a330 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1a340 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a350 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1a360 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1a370 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a380 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a390 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1a3a0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a3b0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1a3c0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1a3d0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1a3e0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1a3f0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1a400 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1a410 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1a420 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1a430 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1a440 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a450 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1a460 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1a470 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1a480 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72  .    clearCursor
1a490 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1a4a0 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
1a4b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1a4c0 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d   pRoot && pRoot-
1a4d0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1a4e0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73  oRoot ){.    ass
1a4f0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
1a500 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  it );.  }else{. 
1a510 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1a520 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1a530 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1a540 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1a550 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20  t, &pRoot, 0)). 
1a560 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
1a570 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a580 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1a590 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a5a0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1a5b0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
1a5c0 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
1a5d0 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70  = pRoot;.  }.  p
1a5e0 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
1a5f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a600 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1a610 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1a620 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1a630 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
1a640 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
1a650 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1a660 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
1a670 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1a680 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
1a690 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
1a6a0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
1a6b0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
1a6c0 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
1a6d0 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
1a6e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1a6f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
1a700 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1a710 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
1a720 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
1a730 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
1a740 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
1a750 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
1a760 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
1a770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a780 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1a790 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1a7a0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1a7b0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a7c0 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
1a7d0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1a7e0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
1a7f0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
1a800 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
1a810 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
1a820 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
1a830 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
1a840 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a850 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1a860 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1a870 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a880 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1a890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1a8a0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a8b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a8c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a8d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a8e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a8f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a900 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a910 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a920 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a930 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1a940 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1a950 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1a960 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1a970 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1a980 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1a990 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1a9a0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a9b0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a9c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a9d0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a9e0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a9f0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
1aa00 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1aa10 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
1aa20 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1aa30 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1aa40 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
1aa50 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
1aa60 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
1aa70 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
1aa80 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
1aa90 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
1aaa0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
1aab0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1aac0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
1aad0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
1aae0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1aaf0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1ab00 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1ab10 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
1ab20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
1ab30 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
1ab40 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1ab50 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
1ab60 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
1ab70 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1ab80 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1ab90 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
1aba0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1abb0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1abc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1abd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1abe0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1abf0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ac00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ac10 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ac20 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1ac30 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1ac40 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1ac50 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1ac60 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1ac70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1ac80 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1ac90 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1aca0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1acb0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1acc0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1acd0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1ace0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1acf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1ad00 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1ad10 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70  nCell - 1;.    p
1ad20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ad30 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1ad40 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1ad50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ad60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
1ad70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1ad80 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1ad90 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ada0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1adb0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1adc0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1add0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1ade0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1adf0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1ae00 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1ae10 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1ae20 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1ae30 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1ae40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1ae50 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1ae60 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1ae70 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1ae80 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1ae90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1aea0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1aeb0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1aec0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1aed0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1aee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1aef0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1af00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1af10 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1af20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1af30 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1af40 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1af50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1af60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1af70 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1af80 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1af90 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
1afa0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1afb0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1afc0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
1afd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1afe0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1aff0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
1b000 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1b010 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1b020 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1b030 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1b040 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1b050 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1b060 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1b070 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1b080 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1b090 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1b0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b0b0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
1b0c0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1b0d0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
1b0e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b0f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1b110 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b120 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1b130 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1b140 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b150 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1b160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b170 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1b180 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1b190 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
1b1a0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1b1b0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b1c0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1b1e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b1f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b200 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b210 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1b220 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1b230 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74  pCur);.      get
1b240 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b250 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1b260 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1b270 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1b280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b290 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1b2a0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1b2b0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
1b2c0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
1b2d0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 4b 65  specified by pKe
1b2e0 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52  y/nKey/pUnKey. R
1b2f0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
1b300 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
1b310 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f  INTKEY tables, o
1b320 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72  nly the nKey par
1b330 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
1b340 20 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55   pKey .** and pU
1b350 6e 4b 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c  nKey must be NUL
1b360 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1b370 62 6c 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e  bles, either pUn
1b380 4b 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e  Key.** must poin
1b390 74 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20  t to a key that 
1b3a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b3b0 20 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c   unpacked, or el
1b3c0 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20  se.** pKey/nKey 
1b3d0 64 65 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62  describes a blob
1b3e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1b3f0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  key..**.** If an
1b400 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
1b410 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
1b420 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1b430 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
1b440 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
1b450 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
1b460 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
1b470 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
1b480 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
1b490 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
1b4a0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
1b4b0 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
1b4c0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
1b4d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1b4e0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
1b4f0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
1b500 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1b510 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
1b520 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65   written to *pRe
1b530 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e  s if pRes!=NULL.
1b540 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1b550 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69  .** this value i
1b560 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1b570 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
1b580 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b590 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b5a0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b5b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b5c0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
1b5d0 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66   than pKey or if
1b5e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1b5f0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1b600 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1b610 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1b620 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1b630 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1b640 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1b650 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b660 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b670 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b680 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b690 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1b6a0 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  es pKey..**.**  
1b6b0 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
1b6c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b6d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b6e0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1b710 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  pKey..**.*/.int 
1b720 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1b730 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1b740 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  pCur,        /* 
1b750 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1b760 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   moved */.  cons
1b770 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1b780 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f     /* The key co
1b790 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65  ntent for indice
1b7a0 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20  s.  Not used by 
1b7b0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61  tables */.  Unpa
1b7c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b  ckedRecord *pUnK
1b7d0 65 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ey,/* Unpacked v
1b7e0 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a  ersion of pKey *
1b7f0 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
1b800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b810 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20  ze of pKey.  Or 
1b820 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  the key for tabl
1b830 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
1b840 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f  Right,         /
1b850 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1b860 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1b870 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1b880 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1b890 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
1b8a0 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a   result flag */.
1b8b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1b8c0 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b  har aSpace[200];
1b8d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b8e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b8f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b900 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b910 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1b920 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1b930 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1b940 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1b950 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1b960 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1b970 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1b980 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1b990 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1b9a0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1b9b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1b9c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b9d0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1b9e0 4b 65 79 20 26 26 20 70 43 75 72 2d 3e 70 50 61  Key && pCur->pPa
1b9f0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1ba00 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1ba10 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20  .nKey==nKey ){. 
1ba20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1ba30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ba40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ba50 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
1ba60 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
1ba70 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20  .nKey<nKey ){.  
1ba80 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1ba90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1baa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1bab0 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  }...  rc = moveT
1bac0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1bad0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1bae0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1baf0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1bb00 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1bb10 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
1bb20 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  it );.  if( pCur
1bb30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bb40 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1bb50 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
1bb60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1bb70 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1bb80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bb90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1bba0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
1bbb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 57  tKey ){.    /* W
1bbc0 65 20 61 72 65 20 67 69 76 65 6e 20 61 6e 20 53  e are given an S
1bbd0 51 4c 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72  QL table to sear
1bbe0 63 68 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ch.  The key is 
1bbf0 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20  the integer.    
1bc00 2a 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61 69 6e  ** rowid contain
1bc10 65 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70 4b 65  ed in nKey.  pKe
1bc20 79 20 61 6e 64 20 70 55 6e 4b 65 79 20 73 68 6f  y and pUnKey sho
1bc30 75 6c 64 20 62 6f 74 68 20 62 65 20 4e 55 4c 4c  uld both be NULL
1bc40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1bc50 70 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  pUnKey==0 );.   
1bc60 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30   assert( pKey==0
1bc70 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
1bc80 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  pUnKey==0 ){.   
1bc90 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65   /* We are to se
1bca0 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65  arch an SQL inde
1bcb0 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20 65 6e  x using a key en
1bcc0 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e  coded as a blob.
1bcd0 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6c 6f 62  .    ** The blob
1bce0 20 69 73 20 66 6f 75 6e 64 20 61 74 20 70 4b 65   is found at pKe
1bcf0 79 20 61 6e 64 20 69 73 20 6e 4b 65 79 20 62 79  y and is nKey by
1bd00 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 20  tes in length.  
1bd10 55 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20 74 68  Unpack.    ** th
1bd20 69 73 20 6b 65 79 20 73 6f 20 74 68 61 74 20 77  is key so that w
1bd30 65 20 63 61 6e 20 75 73 65 20 69 74 2e 20 2a 2f  e can use it. */
1bd40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
1bd50 79 21 3d 30 20 29 3b 0a 20 20 20 20 70 55 6e 4b  y!=0 );.    pUnK
1bd60 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1bd70 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1bd80 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  r->pKeyInfo, nKe
1bd90 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
1bdc0 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
1bdd0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  e));.    if( pUn
1bde0 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
1bdf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1be00 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65  }else{.    /* We
1be10 20 61 72 65 20 74 6f 20 73 65 61 72 63 68 20 61   are to search a
1be20 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e  n SQL index usin
1be30 67 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  g a key that is 
1be40 61 6c 72 65 61 64 79 20 75 6e 70 61 63 6b 65 64  already unpacked
1be50 0a 20 20 20 20 2a 2a 20 61 6e 64 20 68 61 6e 64  .    ** and hand
1be60 65 64 20 74 6f 20 75 73 20 69 6e 20 70 55 6e 4b  ed to us in pUnK
1be70 65 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ey. */.    asser
1be80 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  t( pKey==0 );.  
1be90 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  }.  for(;;){.   
1bea0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
1beb0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
1bec0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1bed0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1bee0 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1bef0 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1bf00 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1bf10 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1bf20 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1bf30 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1bf40 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1bf50 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
1bf60 26 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a  && pUnKey==0 ){.
1bf70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bf80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1bf90 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1bfa0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1bfb0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
1bfc0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1bfd0 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20  >idx = upr;.    
1bfe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
1bff0 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  r->idx = (upr+lw
1c000 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1c010 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
1c020 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1c030 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1c040 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1c050 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1c060 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1c070 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c080 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Key = 1;.      i
1c090 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1c0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
1c0b0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
1c0c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1c0d0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
1c0e0 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
1c0f0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
1c100 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
1c110 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
1c120 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
1c130 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
1c140 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
1c150 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
1c160 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
1c170 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
1c180 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
1c190 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1c1a0 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  Key==nKey ){.   
1c1b0 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1c1c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c1d0 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b  nCellKey<nKey ){
1c1e0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
1c1f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1c200 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1c210 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65  rt( nCellKey>nKe
1c220 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
1c230 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1c240 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c250 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1c260 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1c270 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1c280 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1c290 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1c2a0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1c2b0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1c2c0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1c2d0 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1c2e0 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1c2f0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1c300 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c310 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1c320 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1c330 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c340 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1c350 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1c360 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20   nCellKey );.   
1c370 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1c380 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1c390 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c3a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1c3b0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1c3c0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1c3d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1c3e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c3f0 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
1c400 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70  llKey, (void *)p
1c410 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1c420 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1c430 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c440 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1c450 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1c460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c470 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
1c480 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c490 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1c4a0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
1c4b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c4c0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1c4d0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1c4e0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1c4f0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1c500 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1c510 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c520 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1c530 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20  ur->idx;.       
1c540 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
1c550 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c560 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1c570 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1c580 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30  pRes ) *pRes = 0
1c590 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1c5a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c5b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1c5c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1c5d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c5e0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1c5f0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1c600 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65  >idx+1;.      }e
1c610 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1c620 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a   = pCur->idx-1;.
1c630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c640 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1c650 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1c660 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1c670 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1c690 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75  ur->idx = (lwr+u
1c6a0 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  pr)/2;.    }.   
1c6b0 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1c6c0 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1c6d0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1c6e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1c6f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1c700 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1c710 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1c720 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1c730 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1c740 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c750 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c760 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1c770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1c780 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1c790 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1c7a0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1c7b0 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1c7c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c7d0 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1c7e0 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
1c7f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1c800 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c810 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
1c820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c830 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
1c840 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
1c850 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1c860 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e   lwr;.    pCur->
1c870 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1c880 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c890 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
1c8a0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c8b0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
1c8c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c8d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c8e0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
1c8f0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1c900 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
1c910 74 65 64 20 6f 75 72 20 6f 77 6e 20 75 6e 70 61  ted our own unpa
1c920 63 6b 65 64 20 6b 65 79 20 61 74 20 74 68 65 20  cked key at the 
1c930 74 6f 70 20 6f 66 20 74 68 69 73 0a 20 20 20 20  top of this.    
1c940 2a 2a 20 70 72 6f 63 65 64 75 72 65 2c 20 74 68  ** procedure, th
1c950 65 6e 20 64 65 73 74 72 6f 79 20 74 68 61 74 20  en destroy that 
1c960 6b 65 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  key before retur
1c970 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ning. */.    sql
1c980 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1c990 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 55 6e  packedRecord(pUn
1c9a0 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1c9b0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c9c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c9d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1c9e0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1c9f0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1ca00 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1ca10 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1ca20 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1ca30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1ca40 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1ca50 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1ca60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1ca70 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1ca80 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1ca90 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1caa0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1cab0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1cac0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1cad0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1cae0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1caf0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1cb00 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1cb10 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1cb20 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1cb30 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1cb40 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1cb50 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1cb60 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1cb70 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1cb80 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1cb90 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1cba0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1cbb0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1cbc0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1cbd0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1cbe0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1cbf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1cc00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1cc10 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1cc20 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1cc30 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1cc40 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1cc50 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1cc60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cc70 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1cc80 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1cc90 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1cca0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1ccb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1ccc0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1ccd0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1cce0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1ccf0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1cd00 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1cd10 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1cd20 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1cd30 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1cd40 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1cd50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1cd60 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1cd70 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1cd80 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1cd90 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1cda0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
1cdb0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1cdc0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1cdd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cde0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1cdf0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ce00 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ce10 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1ce20 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1ce30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ce40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1ce50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ce60 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
1ce70 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1ce80 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1ce90 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1cea0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1ceb0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1cec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ced0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1cee0 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1cef0 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1cf00 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1cf10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cf20 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1cf30 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1cf40 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1cf50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1cf60 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1cf70 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1cf80 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1cf90 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1cfa0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1cfb0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
1cfc0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1cfd0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1cfe0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1cff0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1d000 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1d010 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d020 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d030 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1d040 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d050 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1d060 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1d070 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1d080 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1d090 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1d0a0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  do{.      if( sq
1d0b0 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
1d0c0 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
1d0d0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1d0e0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
1d0f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1d100 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1d110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d120 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1d130 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d140 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1d150 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1d160 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1d170 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64  }while( pCur->id
1d180 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1d190 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
1d1a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1d1b0 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20  >leafData ){.   
1d1c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1d1d0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
1d1e0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
1d1f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d200 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1d210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d220 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
1d230 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
1d240 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d250 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
1d260 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1d270 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
1d280 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1d290 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1d2a0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1d2b0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1d2c0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1d2d0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1d2e0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1d2f0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1d300 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1d310 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1d320 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1d330 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d340 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1d350 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1d360 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1d370 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1d380 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1d390 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1d3a0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1d3b0 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1d3c0 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1d3d0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1d3e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d3f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1d400 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1d410 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1d420 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d430 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1d440 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
1d450 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1d460 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1d470 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1d480 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1d490 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1d4a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1d4b0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
1d4c0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1d4d0 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1d4e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1d4f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d500 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1d510 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
1d520 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
1d530 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1d540 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1d550 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20  Cur->idx>=0 );. 
1d560 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d570 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1d580 67 65 74 34 62 79 74 65 28 20 66 69 6e 64 43 65  get4byte( findCe
1d590 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1d5a0 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  idx) );.    rc =
1d5b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1d5c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
1d5d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
1d5e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d5f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1d600 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1d610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1d620 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20  e( pCur->idx==0 
1d630 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
1d640 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1d650 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1d660 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1d670 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1d680 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
1d690 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1d6a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d6c0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1d6d0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1d6e0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1d6f0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1d700 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d  .    pCur->idx--
1d710 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1d720 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1d730 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d740 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
1d750 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
1d760 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1d770 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d780 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1d790 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1d7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d7b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d7c0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
1d7d0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1d7e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1d7f0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
1d800 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d810 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
1d820 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
1d830 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
1d840 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1d850 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d860 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
1d870 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
1d880 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
1d890 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
1d8a0 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
1d8b0 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
1d8c0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
1d8d0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
1d8e0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
1d8f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1d900 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
1d910 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
1d920 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
1d930 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d940 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
1d950 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
1d960 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
1d970 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
1d980 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
1d990 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
1d9a0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
1d9b0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
1d9c0 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
1d9d0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
1d9e0 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
1d9f0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1da00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1da10 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
1da20 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
1da30 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
1da40 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
1da50 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
1da60 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
1da70 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
1da80 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
1da90 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
1daa0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
1dab0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
1dac0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
1dad0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1dae0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
1daf0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
1db00 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
1db10 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
1db20 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
1db30 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1db40 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
1db50 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
1db60 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
1db70 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1db80 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
1db90 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
1dba0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
1dbb0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
1dbc0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1dbd0 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
1dbe0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
1dbf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1dc00 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1dc10 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1dc20 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20  pBt, .  MemPage 
1dc30 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e  **ppPage, .  Pgn
1dc40 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e  o *pPgno, .  Pgn
1dc50 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65  o nearby,.  u8 e
1dc60 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  xact.){.  MemPag
1dc70 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
1dc80 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20   rc;.  int n;   
1dc90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1dca0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1dcb0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  list */.  int k;
1dcc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dcd0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
1dce0 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
1dcf0 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
1dd00 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
1dd10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
1dd20 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73  Trunk = 0;..  as
1dd30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1dd40 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1dd50 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31  tex) );.  pPage1
1dd60 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1dd70 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
1dd80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1dd90 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  ]);.  if( n>0 ){
1dda0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
1ddb0 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
1ddc0 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
1ddd0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
1dde0 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
1ddf0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
1de00 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
1de10 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
1de20 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
1de30 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
1de40 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
1de50 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
1de60 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
1de70 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
1de80 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1de90 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
1dea0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
1deb0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
1dec0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1ded0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
1dee0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
1def0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
1df00 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
1df10 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
1df20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1df30 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
1df40 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70  act && nearby<=p
1df50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1df60 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1df70 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1df80 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
1df90 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
1dfa0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1dfb0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
1dfc0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1dfd0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
1dfe0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1dff0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e000 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1e010 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1e020 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
1e030 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
1e040 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
1e050 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
1e060 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1e070 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
1e080 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
1e090 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
1e0a0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1e0b0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
1e0c0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
1e0d0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
1e0e0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
1e0f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1e100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e110 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1e120 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e130 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e140 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1e150 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
1e160 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
1e170 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
1e180 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
1e190 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
1e1a0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
1e1b0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
1e1c0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
1e1d0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
1e1e0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
1e1f0 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
1e200 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
1e210 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
1e220 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
1e230 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
1e240 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1e250 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
1e260 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
1e270 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
1e280 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1e290 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1e2a0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1e2b0 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
1e2c0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1e2d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1e2e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e2f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e300 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
1e310 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
1e320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e330 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
1e340 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
1e350 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1e360 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
1e370 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
1e380 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1e390 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
1e3a0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
1e3b0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1e3c0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
1e3d0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
1e3e0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
1e3f0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
1e400 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
1e410 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
1e420 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
1e430 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
1e440 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
1e450 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
1e460 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1e470 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
1e480 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1e490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e4a0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1e4b0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1e4c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1e4d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e4e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1e4f0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
1e500 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
1e510 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1e520 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1e530 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1e540 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
1e550 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1e560 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1e570 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1e580 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1e590 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1e5a0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1e5b0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
1e5c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
1e5d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1e5e0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20  4 - 2 ){.       
1e5f0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
1e600 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
1e610 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
1e620 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1e630 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1e640 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1e650 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1e660 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
1e670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e680 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
1e690 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
1e6a0 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
1e6b0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e6c0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
1e6d0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
1e6e0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
1e6f0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
1e700 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
1e710 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
1e720 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
1e730 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
1e740 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
1e750 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
1e760 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
1e770 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1e780 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
1e790 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
1e7a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e7b0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1e7c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e7d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e7e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1e7f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1e800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e810 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
1e820 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1e830 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1e840 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1e850 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e860 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1e870 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1e880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e890 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1e8a0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1e8b0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1e8c0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1e8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e8e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e8f0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
1e900 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
1e910 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
1e920 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
1e930 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
1e940 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
1e950 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
1e960 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
1e970 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
1e980 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
1e990 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
1e9a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
1e9b0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
1e9c0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
1e9d0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
1e9e0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1e9f0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
1ea00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ea10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1ea20 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
1ea30 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
1ea40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1ea50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ea70 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1ea80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ea90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1eaa0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
1eab0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
1eac0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ead0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1eae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
1eaf0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1eb00 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
1eb10 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1eb20 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1eb30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
1eb40 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1eb50 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1eb60 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1eb70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
1eb80 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
1eb90 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
1eba0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
1ebb0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1ebc0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
1ebd0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
1ebe0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
1ebf0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1ec00 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1ec10 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
1ec20 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1ec30 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1ec40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
1ec50 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1ec60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ec70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ec80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1ec90 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
1eca0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1ecb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ecc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1ecd0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1ece0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1ecf0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1ed00 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1ed10 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
1ed20 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1ed30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ed40 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1ed50 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1ed60 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
1ed70 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
1ed80 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
1ed90 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
1eda0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1edb0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
1edc0 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
1edd0 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
1ede0 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b      int closest;
1edf0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
1ee00 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
1ee10 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
1ee20 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
1ee30 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
1ee40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ee50 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1ee60 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1ee70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1ee80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ee90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1eea0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
1eeb0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
1eec0 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b      int i, dist;
1eed0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
1eee0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1eef0 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74    dist = get4byt
1ef00 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
1ef10 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
1ef20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69   if( dist<0 ) di
1ef30 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20  st = -dist;.    
1ef40 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
1ef50 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
1ef60 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67        int d2 = g
1ef70 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1ef80 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b  +i*4]) - nearby;
1ef90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1efa0 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32   d2<0 ) d2 = -d2
1efb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1efc0 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
1efd0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
1efe0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
1eff0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
1f000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f010 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f030 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
1f040 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f050 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
1f060 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
1f070 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
1f080 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
1f090 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
1f0a0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
1f0b0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20   int nPage;.    
1f0c0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1f0d0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1f0e0 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
1f0f0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1f100 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
1f110 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20  f( *pPgno>nPage 
1f120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
1f130 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20  * Free page off 
1f140 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
1f150 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
1f160 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1f170 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f180 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1f190 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f1a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f1b0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1f1c0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
1f1d0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
1f1e0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
1f200 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
1f210 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1f220 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
1f230 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
1f240 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
1f250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f260 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
1f270 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1f280 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
1f290 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
1f2a0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
1f2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f2c0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
1f2d0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1f2e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f2f0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1f300 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1f310 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
1f320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f330 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1f340 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1f350 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61  tRollback((*ppPa
1f360 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1f370 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f380 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f390 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1f3a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1f3b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f3d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1f3e0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1f3f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f410 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1f420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f430 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
1f440 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1f450 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1f460 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
1f470 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
1f480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f490 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
1f4a0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1f4b0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
1f4c0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
1f4d0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
1f4e0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
1f4f0 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
1f500 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1f510 50 61 67 65 72 29 3b 0a 20 20 20 20 2a 70 50 67  Pager);.    *pPg
1f520 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a  no = nPage + 1;.
1f530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f540 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f550 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
1f560 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
1f570 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68  An incr-vacuum h
1f580 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77  as already run w
1f590 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
1f5a0 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20  action. So the. 
1f5b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20       ** page to 
1f5c0 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20  allocate is not 
1f5d0 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61  from the physica
1f5e0 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  l end of the fil
1f5f0 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  e, but.      ** 
1f600 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20  at pBt->nTrunc. 
1f610 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f620 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54  *pPgno = pBt->nT
1f630 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66  runc+1;.      if
1f640 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
1f650 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f660 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50   ){.        (*pP
1f670 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  gno)++;.      }.
1f680 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1f690 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
1f6a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1f6b0 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
1f6c0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
1f6d0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
1f6e0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
1f6f0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
1f700 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1f710 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1f720 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
1f730 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
1f740 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
1f750 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
1f760 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
1f770 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
1f780 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
1f790 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
1f7a0 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
1f7b0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
1f7c0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
1f7d0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
1f7e0 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
1f7f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
1f800 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1f810 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1f820 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
1f830 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
1f840 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
1f850 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
1f860 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
1f870 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1f880 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1f890 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
1f8a0 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
1f8b0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
1f8c0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1f8d0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f8e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f8f0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1f900 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1f910 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1f920 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f940 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1f950 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1f960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f980 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1f990 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
1f9a0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f9b0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1f9c0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
1f9d0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1f9e0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1f9f0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1fa00 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
1fa10 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
1fa20 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1fa30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1fa40 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  evTrunk);.  retu
1fa50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fa60 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68  Add a page of th
1fa70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fa80 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1fa90 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  .**.** sqlite3Pa
1faa0 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f  gerUnref() is NO
1fab0 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61  T called for pPa
1fac0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1fad0 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
1fae0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74  ge *pPage){.  Bt
1faf0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1fb00 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  age->pBt;.  MemP
1fb10 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1fb20 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  t->pPage1;.  int
1fb30 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a   rc, n, k;..  /*
1fb40 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67   Prepare the pag
1fb50 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f  e for freeing */
1fb60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fb70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1fb80 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1fb90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fba0 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
1fbb0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1fbc0 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
1fbd0 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  e(pPage->pParent
1fbe0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72  );.  pPage->pPar
1fbf0 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ent = 0;..  /* I
1fc00 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
1fc10 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
1fc20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
1fc30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fc40 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1fc50 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1fc60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d  return rc;.  n =
1fc70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1fc80 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1fc90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1fca0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b  1->aData[36], n+
1fcb0 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
1fcc0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1fcd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
1fce0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1fcf0 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
1fd00 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
1fd10 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
1fd20 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
1fd30 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
1fd40 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
1fd50 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
1fd60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fd70 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1fd80 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1fd90 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
1fda0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1fdb0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
1fdc0 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
1fdd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fde0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1fdf0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1fe00 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1fe10 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
1fe20 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1fe30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
1fe40 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
1fe50 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
1fe60 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
1fe70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fe80 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
1fe90 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65  apPut(pBt, pPage
1fea0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46  ->pgno, PTRMAP_F
1feb0 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
1fec0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1fed0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1fee0 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1fef0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1ff00 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1ff10 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
1ff20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ff30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1ff40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ff50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
1ff60 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1ff70 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
1ff80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1ff90 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
1ffa0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
1ffb0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1ffc0 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
1ffd0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
1ffe0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
1fff0 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
20000 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
20010 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
20020 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
20030 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
20040 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
20050 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
20060 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
20070 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
20080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20090 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67  eeGetPage(pBt, g
200a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
200b0 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
200c0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
200d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
200e0 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
200f0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
20100 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
20110 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
20120 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
20130 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
20140 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
20150 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
20160 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
20170 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
20180 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
20190 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
201a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
201b0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
201c0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
201d0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
201e0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
201f0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
20200 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
20210 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
20220 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
20230 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
20240 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
20250 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
20260 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
20270 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
20280 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
20290 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
202a0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
202b0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
202c0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
202d0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
202e0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
202f0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
20300 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
20310 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
20320 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
20330 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
20340 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
20350 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
20360 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73  l contain to res
20370 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
20380 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
20390 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
203a0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
203b0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
203c0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
203d0 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
203e0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
203f0 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
20400 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
20410 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
20420 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
20430 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
20440 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
20450 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
20460 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
20470 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
20480 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20490 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
204a0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
204b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
204c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
204d0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
204e0 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70  aData, pTrunk->p
204f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75  gno);.        pu
20500 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
20510 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
20520 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20530 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20540 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
20550 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
20560 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
20570 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
20580 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20  lacing %d\n",.  
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
205a0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e  age->pgno, pTrun
205b0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
205c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
205d0 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63   k<0 ){.      rc
205e0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
205f0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
20600 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
20610 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20  ewly freed page 
20620 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65  as a leaf on the
20630 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a   current trunk *
20640 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20650 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20660 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
20670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20690 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
206a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
206b0 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  k+1);.        pu
206c0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
206d0 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50  aData[8+k*4], pP
206e0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  age->pgno);.#ifn
206f0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
20700 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
20710 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
20720 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
20730 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  bPage);.#endif. 
20740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
20750 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
20760 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
20770 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
20780 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
20790 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
207a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
207b0 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runk);.  }.  ret
207c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
207d0 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
207e0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
207f0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
20800 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
20810 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
20820 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
20830 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20840 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
20850 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
20860 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
20870 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
20880 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
20890 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
208a0 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a   int ovflPageSiz
208b0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
208c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
208d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
208e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
208f0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20900 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
20910 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
20920 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
20930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20940 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
20950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
20960 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
20970 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
20980 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
20990 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
209a0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
209b0 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69  ]);.  ovflPageSi
209c0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
209d0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
209e0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
209f0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
20a00 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
20a10 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
20a20 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
20a30 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
20a40 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
20a50 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d  nOvfl-- ){.    M
20a60 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20  emPage *pOvfl;. 
20a70 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d     if( ovflPgno=
20a80 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70  =0 || ovflPgno>p
20a90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
20aa0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
20ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20ac0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20ad0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
20ae0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
20af0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
20b00 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30  pOvfl, (nOvfl==0
20b10 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a  )?0:&ovflPgno);.
20b20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20b30 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
20b40 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29   freePage(pOvfl)
20b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
20b60 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
20b70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
20b80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20bb0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
20bc0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
20bd0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
20be0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
20bf0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
20c00 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
20c10 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
20c20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
20c30 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
20c40 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
20c50 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
20c60 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
20c70 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
20c80 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
20c90 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
20ca0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
20cb0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
20cc0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
20cd0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
20ce0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
20cf0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
20d00 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
20d10 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
20d20 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
20d30 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
20d40 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
20d50 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
20d60 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
20d70 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
20d80 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
20d90 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
20da0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
20db0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
20dc0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
20dd0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
20de0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20df0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
20e00 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
20e10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
20e20 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
20e30 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
20e40 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
20e50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
20e60 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
20e70 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
20e80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
20e90 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
20ea0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
20eb0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ed0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
20ee0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
20ef0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
20f00 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
20f10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20f20 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
20f30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
20f40 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
20f50 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
20f60 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
20f70 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
20f80 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
20f90 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
20fa0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
20fb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
20fc0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
20fd0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
20fe0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20ff0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
21000 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
21010 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
21020 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
21030 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
21040 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21050 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21060 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  utex) );..  /* F
21070 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
21080 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
21090 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
210a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
210b0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
210c0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
210d0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
210e0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
210f0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
21100 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
21110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
21120 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
21130 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
21140 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
21150 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
21160 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71  64*)&nKey);.  sq
21170 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
21180 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
21190 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
211a0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
211b0 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
211c0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
211d0 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
211e0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
211f0 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29  a==nData+nZero )
21200 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
21210 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
21220 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
21230 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
21240 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
21250 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
21260 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
21270 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
21280 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
21290 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
212a0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
212b0 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
212c0 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
212d0 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
212e0 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
212f0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
21300 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
21310 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
21320 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
21330 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
21340 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
21350 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
21360 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
21370 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63        int isExac
21380 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  t = 0;.#ifndef S
21390 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
213a0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
213b0 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
213c0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
213d0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
213e0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
213f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
21400 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
21410 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
21420 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
21430 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
21440 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
21450 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
21460 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
21470 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
21480 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
21490 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
214a0 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e     if( pgnoOvfl>
214b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
214c0 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a  * isExact = 1; *
214d0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
214e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
214f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
21500 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
21510 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
21520 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63  pgnoOvfl, isExac
21530 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
21540 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21550 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
21560 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
21570 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
21580 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
21590 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
215a0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
215b0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
215c0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
215d0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
215e0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
215f0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
21600 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
21610 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
21620 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
21630 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
21640 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
21650 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
21660 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
21670 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
21680 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
21690 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
216a0 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
216b0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
216c0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
216d0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
216e0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
216f0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
21700 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
21710 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
21720 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
21730 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
21740 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21750 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
21760 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
21770 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
21780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21790 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
217a0 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
217b0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
217c0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
217d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
217e0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
217f0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
21800 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
21810 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
21820 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21830 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
21840 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
21850 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
21860 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
21870 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
21880 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21890 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
218a0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
218b0 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
218c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
218d0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
218e0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
218f0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
21900 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
21910 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
21920 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
21930 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
21940 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
21950 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
21960 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
21970 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
21980 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
21990 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
219a0 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
219b0 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e  eLeft;.    if( n
219c0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
219d0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
219e0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
219f0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
21a00 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
21a10 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
21a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
21a30 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
21a40 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
21a50 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
21a60 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
21a70 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
21a80 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
21a90 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
21aa0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
21ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
21ac0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
21ad0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
21ae0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
21af0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
21b00 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
21b10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21b20 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50   Change the MemP
21b30 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e  age.pParent poin
21b40 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ter on the page 
21b50 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a  whose number is.
21b60 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ** given in the 
21b70 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
21b80 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e  so that MemPage.
21b90 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68  pParent holds th
21ba0 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20  e.** pointer in 
21bb0 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
21bc0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
21bd0 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 42  t reparentPage(B
21be0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
21bf0 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65  no pgno, MemPage
21c00 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e   *pNewParent, in
21c10 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67  t idx){.  MemPag
21c20 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61  e *pThis;.  DbPa
21c30 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
21c40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21c50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
21c60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
21c70 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d  rt( pNewParent!=
21c80 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  0 );.  if( pgno=
21c90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
21ca0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
21cb0 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20   pBt->pPager!=0 
21cc0 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
21cd0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
21ce0 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
21cf0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
21d00 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73  age ){.    pThis
21d10 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
21d20 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
21d30 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ra(pDbPage);.   
21d40 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e   if( pThis->isIn
21d50 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  it ){.      asse
21d60 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61  rt( pThis->aData
21d70 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
21d80 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
21d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  ;.      if( pThi
21da0 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77  s->pParent!=pNew
21db0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
21dc0 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
21dd0 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61  rent ) sqlite3Pa
21de0 67 65 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e  gerUnref(pThis->
21df0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
21e00 29 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73  );.        pThis
21e10 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77  ->pParent = pNew
21e20 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  Parent;.        
21e30 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
21e40 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50  pNewParent->pDbP
21e50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
21e60 20 20 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61      pThis->idxPa
21e70 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20  rent = idx;.    
21e80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
21e90 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
21ea0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
21eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21ec0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
21ed0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
21ee0 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
21ef0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50  Put(pBt, pgno, P
21f00 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
21f10 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  wParent->pgno);.
21f20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
21f30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21f40 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  ..../*.** Change
21f50 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
21f60 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c  nter of all chil
21f70 64 72 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f  dren of pPage to
21f80 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74   point back.** t
21f90 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  o pPage..**.** I
21fa0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66  n other words, f
21fb0 6f 72 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f  or every child o
21fc0 66 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20  f pPage, invoke 
21fd0 72 65 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a  reparentPage().*
21fe0 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
21ff0 68 61 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b  hat each child k
22000 6e 6f 77 73 20 74 68 61 74 20 70 50 61 67 65 20  nows that pPage 
22010 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a  is its parent..*
22020 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22030 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66  e gets called af
22040 74 65 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29  ter you memcpy()
22050 20 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a   one page into.*
22060 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74  * another..*/.st
22070 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e  atic int reparen
22080 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50  tChildPages(MemP
22090 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
220a0 6e 74 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64  nt i;.  BtShared
220b0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
220c0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
220d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
220e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
220f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
22100 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
22110 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
22120 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22130 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  OK;..  for(i=0; 
22140 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
22150 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
22160 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
22170 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 72 63  Page, i);.    rc
22180 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
22190 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
221a0 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b  ell), pPage, i);
221b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
221c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
221d0 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72  rc;.  }.  rc = r
221e0 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
221f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22200 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
22210 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20  drOffset+8]), . 
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22230 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20     pPage, i);.  
22240 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
22250 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
22260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
22270 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
22280 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
22290 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
222a0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
222b0 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
222c0 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
222d0 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
222e0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
222f0 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
22300 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
22310 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
22320 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
22330 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
22340 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
22350 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
22360 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
22370 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
22380 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
22390 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
223a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
223b0 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
223c0 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
223d0 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69  int sz){.  int i
223e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
223f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
22400 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
22410 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
22420 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
22430 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
22440 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
22450 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
22460 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
22470 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
22480 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
22490 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
224a0 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
224b0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
224c0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
224d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
224e0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
224f0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
22500 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
22510 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
22520 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
22530 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22540 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
22550 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
22560 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
22570 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
22580 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
22590 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
225a0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
225b0 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ptr);.  assert( 
225c0 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d  pc>10 && pc+sz<=
225d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
225e0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65  leSize );.  free
225f0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
22600 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64   sz);.  for(i=id
22610 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
22620 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
22630 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
22640 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
22650 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
22660 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
22670 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
22680 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
22690 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
226a0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
226b0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70  >nFree += 2;.  p
226c0 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
226d0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   1;.}../*.** Ins
226e0 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
226f0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
22700 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
22710 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
22720 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
22730 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
22740 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
22750 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
22760 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
22770 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
22780 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
22790 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
227a0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
227b0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
227c0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
227d0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
227e0 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
227f0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
22800 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
22810 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
22820 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
22830 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
22840 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
22850 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
22860 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
22870 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
22880 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
22890 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
228a0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
228b0 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
228c0 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
228d0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
228e0 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
228f0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
22900 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
22910 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
22920 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
22930 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
22940 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
22950 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
22960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
22970 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
22980 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
22990 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
229a0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
229b0 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
229c0 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
229d0 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
229e0 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
229f0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
22a00 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
22a10 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
22a20 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
22a30 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
22a40 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
22a50 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
22a60 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
22a70 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
22a80 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
22a90 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
22aa0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
22ab0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
22ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
22ad0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
22ae0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
22af0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
22b00 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
22b10 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
22b20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
22b30 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
22b40 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
22b50 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
22b60 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
22b70 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
22b80 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
22b90 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
22ba0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
22bb0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
22bc0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
22bd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22be0 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
22bf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22c00 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
22c10 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
22c20 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22c30 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
22c40 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
22c50 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
22c60 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
22c70 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
22c80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22c90 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
22ca0 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
22cb0 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
22cc0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
22cd0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
22ce0 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
22cf0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
22d00 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
22d10 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
22d20 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
22d30 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
22d40 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
22d50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22d60 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
22d70 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
22d80 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
22d90 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
22da0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
22db0 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
22dc0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
22dd0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
22de0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
22df0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
22e00 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
22e10 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22e20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22e30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22e40 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
22e50 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
22e60 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
22e70 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
22e80 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
22e90 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
22ea0 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
22eb0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
22ec0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
22ed0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
22ee0 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
22ef0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
22f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73  .    assert( j<s
22f10 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
22f20 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
22f30 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20  ->aOvfl[0]) );. 
22f40 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
22f50 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
22f60 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
22f70 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20  fl[j].idx = i;. 
22f80 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
22f90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
22fa0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
22fb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
22fc0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
22fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
22ff0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23000 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23010 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
23020 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
23030 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
23040 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
23050 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
23060 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
23070 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
23080 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
23090 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
230a0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
230b0 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
230c0 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
230d0 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
230e0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
230f0 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
23100 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
23110 0a 20 20 20 20 20 20 64 65 66 72 61 67 6d 65 6e  .      defragmen
23120 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
23130 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
23140 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
23150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23160 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
23170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
23180 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
23190 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
231a0 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
231b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
231c0 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
231d0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
231e0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
231f0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
23200 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
23210 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
23220 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
23230 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
23240 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
23250 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
23260 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
23270 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
23280 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
23290 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
232a0 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
232b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
232c0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
232d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
232e0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
232f0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
23300 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e  xShift = 1;.#ifn
23310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23320 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
23330 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
23340 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
23350 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
23360 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
23370 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
23380 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
23390 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
233a0 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
233b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
233c0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
233d0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
233e0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
233f0 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
23400 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
23410 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
23420 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61   &info);.      a
23430 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
23440 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
23450 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
23460 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
23470 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66  ;.      if( (inf
23480 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
23490 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
234a0 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
234b0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
234c0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
234d0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
234e0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
234f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
23500 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
23510 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
23520 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
23530 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
23540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23550 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
23560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23570 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
23580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23590 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
235a0 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
235b0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
235c0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
235d0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
235e0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
235f0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
23600 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
23610 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
23620 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
23630 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
23640 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
23650 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
23660 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
23670 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
23680 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
23690 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
236a0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
236b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
236c0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
236d0 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
236e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
236f0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
23700 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
23710 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
23720 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
23730 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
23740 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
23750 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
23760 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
23770 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
23780 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
23790 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
237a0 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
237b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
237c0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
237d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
237e0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
237f0 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
23800 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23810 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
23820 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
23830 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
23840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
23850 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23860 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
23870 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  x) );.  totalSiz
23880 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 0;.  for(i=0
23890 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
238a0 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b  .    totalSize +
238b0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a  = aSize[i];.  }.
238c0 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53    assert( totalS
238d0 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61  ize+2*nCell<=pPa
238e0 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61  ge->nFree );.  a
238f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
23900 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c  ell==0 );.  cell
23910 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
23920 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
23930 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
23940 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
23950 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
23960 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
23970 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  ], nCell);.  if(
23980 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65   nCell ){.    ce
23990 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74  llbody = allocat
239a0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f  eSpace(pPage, to
239b0 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  talSize);.    as
239c0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30  sert( cellbody>0
239d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
239e0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
239f0 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  2*nCell );.    p
23a00 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
23a10 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28  *nCell;.    for(
23a20 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
23a30 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79  +){.      put2by
23a40 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72  te(&data[cellptr
23a50 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
23a60 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
23a70 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
23a80 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
23a90 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20  ;.      cellptr 
23aa0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c  += 2;.      cell
23ab0 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  body += aSize[i]
23ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23ad0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
23ae0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
23af0 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50  Size );.  }.  pP
23b00 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  age->nCell = nCe
23b10 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
23b20 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
23b30 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
23b40 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
23b50 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
23b60 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
23b70 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
23b80 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
23b90 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
23ba0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
23bb0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
23bc0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
23bd0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
23be0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
23bf0 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
23c00 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
23c10 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
23c20 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
23c30 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
23c40 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
23c50 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
23c60 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
23c70 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
23c80 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
23c90 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
23ca0 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
23cb0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
23cc0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
23cd0 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
23ce0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
23cf0 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
23d00 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
23d10 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
23d20 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
23d30 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
23d40 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
23d50 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
23d60 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
23d70 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
23d80 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
23d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23da0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
23db0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
23dc0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
23dd0 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
23de0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
23df0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
23e00 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f  alance */../* Fo
23e10 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
23e20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
23e30 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20  lance(MemPage*, 
23e40 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  int);..#ifndef S
23e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
23e60 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
23e70 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
23e80 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
23e90 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
23ea0 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
23eb0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
23ec0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
23ed0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
23ee0 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
23ef0 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
23f00 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
23f10 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
23f20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
23f30 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
23f40 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
23f50 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
23f60 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
23f70 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
23f80 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
23f90 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
23fa0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
23fb0 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
23fc0 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
23fd0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
23fe0 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
23ff0 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
24000 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
24010 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
24020 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
24030 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
24040 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
24050 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
24060 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
24070 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
24080 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
24090 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
240a0 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
240b0 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
240c0 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
240d0 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
240e0 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
240f0 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
24100 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
24110 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
24120 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
24130 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
24140 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
24150 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
24160 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
24170 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
24180 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
24190 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65   *pPage, MemPage
241a0 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e   *pParent){.  in
241b0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
241c0 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67  *pNew;.  Pgno pg
241d0 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65  noNew;.  u8 *pCe
241e0 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c  ll;.  u16 szCell
241f0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
24200 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  o;.  BtShared *p
24210 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
24220 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78  .  int parentIdx
24230 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
24240 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20  l;   /* pParent 
24250 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
24260 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
24270 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20  parentSize;     
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24290 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76   Size of new div
242a0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75  ider cell */.  u
242b0 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d  8 parentCell[64]
242c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
242d0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68   /* Space for th
242e0 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
242f0 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
24300 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24310 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
24320 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
24330 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
24340 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
24350 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
24360 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
24370 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
24380 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
24390 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
243a0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
243b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
243c0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
243d0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
243e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
243f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24400 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
24410 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
24420 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
24430 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
24440 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
24450 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
24460 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
24470 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
24480 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
24490 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
244a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
244b0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
244c0 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
244d0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
244e0 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
244f0 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
24500 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
24510 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
24520 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
24530 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
24540 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
24550 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
24560 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
24570 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  is.  ** so that 
24580 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
24590 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
245a0 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
245b0 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69  and.  ** pPage i
245c0 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
245d0 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2a  ght child. .  **
245e0 0a 20 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65  .  ** Ignore the
245f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
24600 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c   the call to fil
24610 6c 49 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49  lInCell(). fillI
24620 6e 43 65 6c 6c 28 29 0a 20 20 2a 2a 20 6d 61 79  nCell().  ** may
24630 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68   only return oth
24640 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
24650 4b 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  K if it is requi
24660 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  red to allocate.
24670 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
24680 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24690 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e   Since an intern
246a0 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20  al table B-Tree 
246b0 63 65 6c 6c 20 0a 20 20 2a 2a 20 6d 61 79 20 6e  cell .  ** may n
246c0 65 76 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20  ever spill over 
246d0 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  onto an overflow
246e0 20 70 61 67 65 20 28 69 74 20 69 73 20 61 20 6d   page (it is a m
246f0 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20 2a 2a 20  aximum of .  ** 
24700 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
24710 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ), it is not nec
24720 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b  cessary to check
24730 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
24740 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69  ..  **.  ** Simi
24750 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65 72  larly, the inser
24760 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e  tCell() function
24770 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20   cannot fail if 
24780 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 62 65  the page.  ** be
24790 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74  ing inserted int
247a0 6f 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69  o is already wri
247b0 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 63 65  table and the ce
247c0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20 20 2a  ll does not .  *
247d0 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65  * contain an ove
247e0 72 66 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53  rflow pointer. S
247f0 6f 20 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65  o ignore this re
24800 74 75 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20  turn code too.. 
24810 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24820 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
24830 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
24840 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
24850 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c  >nCell-1);.  sql
24860 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
24870 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
24880 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 66 69  ll, &info);.  fi
24890 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
248a0 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c  , parentCell, 0,
248b0 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
248c0 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65  , 0, &parentSize
248d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 72  );.  assert( par
248e0 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20  entSize<64 );.  
248f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
24900 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
24910 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
24920 29 20 29 3b 0a 20 20 69 6e 73 65 72 74 43 65 6c  ) );.  insertCel
24930 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
24940 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c  tIdx, parentCell
24950 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c  , parentSize, 0,
24960 20 34 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   4);.  put4byte(
24970 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
24980 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
24990 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
249a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
249b0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
249c0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
249d0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a  +8], pgnoNew);..
249e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
249f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24a00 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
24a10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
24a20 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
24a30 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
24a40 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
24a50 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
24a60 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
24a70 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a  er from the .  *
24a80 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
24a90 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
24aa0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
24ab0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
24ac0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  um ){.    rc = p
24ad0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
24ae0 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
24af0 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
24b00 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  no);.    if( rc=
24b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24b20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
24b30 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b  utOvfl(pNew, 0);
24b40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24b60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
24b70 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72  e(pNew);.      r
24b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24b90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
24ba0 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
24bb0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
24bc0 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e  w page and balan
24bd0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
24be0 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ge,.  ** in case
24bf0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
24c00 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
24c10 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
24c20 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
24c30 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
24c40 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61  );.  return bala
24c50 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
24c60 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
24c70 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
24c80 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
24c90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
24ca0 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73  istributes Cells
24cb0 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70   on pPage and up
24cc0 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67   to NN*2 sibling
24cd0 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f  s.** of pPage so
24ce0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
24cf0 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73  have about the s
24d00 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
24d10 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75  ee space..** Usu
24d20 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73  ally NN siblings
24d30 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
24d40 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64  of pPage is used
24d50 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
24d60 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72  g,.** though mor
24d70 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  e siblings might
24d80 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73   come from one s
24d90 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20  ide if pPage is 
24da0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20  the first.** or 
24db0 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
24dc0 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50  s parent.  If pP
24dd0 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68  age has fewer th
24de0 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73  an 2*NN siblings
24df0 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
24e00 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
24e10 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
24e20 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
24e30 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
24e40 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
24e50 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
24e60 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
24e70 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
24e80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
24e90 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
24ea0 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
24eb0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
24ec0 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72  reased by one or
24ed0 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66  .** two in an ef
24ee0 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
24ef0 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
24f00 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
24f10 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  . The root page.
24f20 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e  ** is special an
24f30 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  d is allowed to 
24f40 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
24f50 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a   If pPage is .**
24f60 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
24f70 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f  then the depth o
24f80 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74  f the tree might
24f90 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a   be increased.**
24fa0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
24fb0 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61   one, as necessa
24fc0 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ry, to keep the 
24fd0 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62  root page from b
24fe0 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  eing.** overfull
24ff0 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   or completely e
25000 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mpty..**.** Note
25010 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
25020 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
25030 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43  d, some of the C
25040 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a  ells on pPage.**
25050 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
25060 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
25070 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
25080 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
25090 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
250a0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50   is overfull.  P
250b0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f  art of the job o
250c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
250d0 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  s to.** make sur
250e0 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20  e all Cells for 
250f0 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e  pPage once again
25100 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61   fit in pPage->a
25110 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e  Data[]..**.** In
25120 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
25130 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62  alancing the sib
25140 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20  lings of pPage, 
25150 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  the parent of pP
25160 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63  age.** might bec
25170 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
25180 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74  underfull.  If t
25190 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
251a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
251b0 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  * is called recu
251c0 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70  rsively on the p
251d0 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arent..**.** If 
251e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
251f0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
25200 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
25210 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
25220 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
25230 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74   state.  So if t
25240 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
25250 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
25260 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
25270 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
25280 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
25290 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20  nonroot(MemPage 
252a0 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
252b0 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ge *pParent;    
252c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
252d0 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a  arent of pPage *
252e0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
252f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25300 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
25310 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
25320 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
25330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25340 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
25350 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
25360 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
25370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
25380 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
25390 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
253a0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
253b0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
253c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
253d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
253e0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
253f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
25400 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
25410 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
25420 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
25430 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
25440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
25450 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
25460 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
25470 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
25480 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
25490 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
254a0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
254b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
254c0 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
254d0 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
254e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
25510 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
25520 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
25530 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25550 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
25560 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
25570 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
25580 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
25590 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
255a0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
255b0 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
255c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
255d0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
255e0 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
255f0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
25600 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
25610 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
25620 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
25630 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
25640 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25660 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
25670 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
25680 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
25690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
256a0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
256b0 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
256c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
256d0 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
256e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
256f0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
25700 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
25710 6e 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20  nt iSpace2 = 0; 
25720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25730 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
25740 20 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f   of aSpace2[] */
25750 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
25760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25770 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
25780 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
25790 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
257a0 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
257b0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
257c0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
257d0 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  lings */.  Pgno 
257e0 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20  pgnoOld[NB];    
257f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25800 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
25810 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d   page in apOld[]
25820 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
25830 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
25840 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
25850 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
25860 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
25870 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
25880 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
25890 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
258a0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
258b0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  ancing */.  Pgno
258c0 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20   pgnoNew[NB+2]; 
258d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
258e0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
258f0 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b  h page in apNew[
25900 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  ] */.  u8 *apDiv
25910 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
25920 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
25930 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
25940 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
25950 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
25960 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
25970 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
25980 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
25990 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
259a0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
259b0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
259c0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
259d0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
259e0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
259f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
25a00 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
25a10 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
25a20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a40 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
25a50 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
25a60 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
25a70 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
25a80 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c  /* Space for hol
25a90 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43  ding data of apC
25aa0 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  opy[] */.  u8 *a
25ab0 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20  Space1;         
25ac0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
25ad0 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
25ae0 73 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62  s cells before b
25af0 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a  alance */.  u8 *
25b00 61 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  aSpace2 = 0;    
25b10 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
25b20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72  overflow divider
25b30 73 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61  s cells after ba
25b40 6c 61 6e 63 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lance */.#ifndef
25b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25b60 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46  OVACUUM.  u8 *aF
25b70 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
25b80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25b90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
25ba0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
25bb0 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20   );..  /* .  ** 
25bc0 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20  Find the parent 
25bd0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
25be0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
25bf0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
25c00 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
25c10 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
25c20 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65  DbPage) || pPage
25c30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
25c40 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
25c50 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20  >pBt;.  pParent 
25c60 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
25c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
25c80 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ent );.  if( SQL
25c90 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
25ca0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25cb0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
25cc0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
25cd0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43   rc;.  }..  TRAC
25ce0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
25cf0 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
25d00 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
25d10 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
25d20 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
25d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
25d40 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
25d50 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
25d60 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
25d70 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
25d80 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
25d90 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
25da0 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
25db0 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
25dc0 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
25dd0 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
25de0 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65  ** and the new e
25df0 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68  ntry is the righ
25e00 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20  t-most entry in 
25e10 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73  the tree (it has
25e20 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73   the.  ** larges
25e30 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20  t key) then use 
25e40 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61  the special bala
25e50 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74  nce_quick() rout
25e60 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c  ine for.  ** bal
25e70 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65  ancing.  balance
25e80 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68  _quick() is much
25e90 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75   faster and resu
25ea0 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72  lts in a tighter
25eb0 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66  .  ** packing of
25ec0 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d   data in the com
25ed0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  mon case..  */. 
25ee0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
25ef0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25f00 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20  >intKey &&.     
25f10 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
25f20 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25f30 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
25f40 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
25f50 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
25f60 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
25f70 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
25f80 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20  ->pgno!=1 &&.   
25f90 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
25fa0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
25fb0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
25fc0 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ])==pPage->pgno.
25fd0 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20    ){.    /*.    
25fe0 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  ** TODO: Check t
25ff0 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74  he siblings to t
26000 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65  he left of pPage
26010 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74  . It may be that
26020 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65  .    ** they are
26030 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f   not full and no
26040 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71   new page is req
26050 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
26060 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
26070 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50  _quick(pPage, pP
26080 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  arent);.  }.#end
26090 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  if..  if( SQLITE
260a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
260b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
260c0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  ge->pDbPage)) ){
260d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
260e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
260f0 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
26100 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
26110 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
26120 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
26130 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
26140 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
26150 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
26160 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
26170 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
26180 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
26190 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
261a0 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
261b0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
261c0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
261d0 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
261e0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
261f0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
26200 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
26210 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
26220 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
26230 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
26240 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64     for(idx=0; id
26250 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
26260 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
26270 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  if( get4byte(fin
26280 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
26290 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20  dx))==pgno ){.  
262a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
262b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
262c0 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65  ssert( idx<pPare
262d0 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  nt->nCell.      
262e0 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79         || get4by
262f0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
26300 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
26310 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20  ffset+8])==pgno 
26320 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26330 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  idx = pPage->idx
26340 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  Parent;.  }..  /
26350 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  *.  ** Initializ
26360 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74  e variables so t
26370 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hat it will be s
26380 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a  afe to jump.  **
26390 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c   directly to bal
263a0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20  ance_cleanup at 
263b0 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f  any moment..  */
263c0 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d  .  nOld = nNew =
263d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
263e0 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
263f0 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20  DbPage);..  /*. 
26400 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
26410 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
26420 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
26430 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
26440 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
26450 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
26460 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
26470 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
26480 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
26490 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
264a0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
264b0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
264c0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
264d0 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
264e0 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
264f0 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
26500 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
26510 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
26520 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
26530 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
26540 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
26550 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
26560 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
26570 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
26580 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
26590 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
265a0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
265b0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
265c0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
265d0 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
265e0 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
265f0 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
26600 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
26610 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
26620 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
26630 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
26640 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
26650 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
26660 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
26670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
26680 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
26690 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
266a0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
266b0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
266c0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
266d0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
266e0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
266f0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
26700 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
26710 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
26720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
26730 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26740 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
26750 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
26760 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20  [i], &apOld[i], 
26770 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
26780 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
26790 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
267a0 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
267b0 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70  rent = k;.    ap
267c0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
267d0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
267e0 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
267f0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
26800 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
26810 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
26820 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
26830 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
26840 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
26850 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
26860 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
26870 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
26880 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
26890 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
268a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
268b0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
268c0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
268d0 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63  .  */.  szScratc
268e0 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
268f0 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
26920 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
26930 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
26960 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e   */.     + (ROUN
26970 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
26980 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a  e))+pBt->pageSiz
26990 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20  e)*NB  /* aCopy 
269a0 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
269b0 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269d0 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
269e0 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55   */.     + (ISAU
269f0 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43  TOVACUUM ? nMaxC
26a00 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20  ells : 0);      
26a10 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
26a20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
26a30 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
26a40 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
26a50 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
26a60 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
26a70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26a80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
26a90 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
26aa0 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
26ab0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
26ac0 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a   aCopy[0] = (u8*
26ad0 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
26ae0 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ls];.  assert( (
26af0 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a  (aCopy[0] - (u8*
26b00 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30  )apCell) & 7)==0
26b10 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
26b20 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
26b30 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
26b40 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  <NB; i++){.    a
26b50 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79  Copy[i] = &aCopy
26b60 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  [i-1][pBt->pageS
26b70 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
26b80 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
26b90 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
26ba0 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[i] - (u8*)apCe
26bb0 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
26bc0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
26bd0 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
26be0 20 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26   }.  aSpace1 = &
26bf0 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d  aCopy[NB-1][pBt-
26c00 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
26c10 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
26c20 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  )];.  assert( ((
26c30 61 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61  aSpace1 - (u8*)a
26c40 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
26c50 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
26c60 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
26c70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26c80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26c90 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
26ca0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61 46  Vacuum ){.    aF
26cb0 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70  rom = &aSpace1[p
26cc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
26cd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 53 70 61   }.#endif.  aSpa
26ce0 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ce2 = sqlite3Pag
26cf0 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67  eMalloc(pBt->pag
26d00 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53  eSize);.  if( aS
26d10 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20  pace2==0 ){.    
26d20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
26d30 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
26d40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
26d50 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
26d60 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
26d70 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
26d80 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
26d90 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
26da0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
26db0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
26dc0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
26dd0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
26de0 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
26df0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
26e00 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
26e10 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
26e20 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
26e30 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
26e40 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
26e50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
26e60 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
26e70 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
26e80 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
26e90 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d  )aCopy[i];.    m
26ea0 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69  emcpy(p, apOld[i
26eb0 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
26ec0 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  e));.    p->aDat
26ed0 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d  a = (void*)&p[1]
26ee0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
26ef0 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
26f00 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
26f10 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
26f20 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
26f30 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
26f40 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
26f50 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
26f60 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
26f70 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
26f80 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
26f90 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
26fa0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
26fb0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
26fc0 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
26fd0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
26fe0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
26ff0 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
27000 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
27010 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
27020 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
27030 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
27040 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
27050 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
27060 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
27070 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
27080 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
27090 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
270a0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
270b0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
270c0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
270d0 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
270e0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
270f0 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
27100 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
27110 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
27120 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
27130 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
27140 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
27150 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
27160 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
27170 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
27180 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
27190 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
271a0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
271b0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
271c0 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
271d0 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
271e0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
271f0 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
27200 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
27210 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
27220 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
27230 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
27240 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
27250 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  fData = pPage->l
27260 65 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65  eafData && pPage
27270 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d  ->leaf;.  for(i=
27280 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
27290 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
272a0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
272b0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
272c0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
272d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
272e0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
272f0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
27300 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
27310 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27320 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
27330 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
27340 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
27350 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
27360 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
27370 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
27380 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
27390 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
273a0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
273b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
273c0 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20         int a;.  
273d0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
273e0 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  l] = i;.        
273f0 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d  for(a=0; a<pOld-
27400 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29  >nOverflow; a++)
27410 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
27420 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70  pOld->aOvfl[a].p
27430 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65  Cell==apCell[nCe
27440 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ll] ){.         
27450 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
27460 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
27470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27490 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
274a0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
274b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
274c0 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75  Old-1 ){.      u
274d0 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65  16 sz = cellSize
274e0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
274f0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  iv[i]);.      if
27500 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
27510 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68        /* With th
27520 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c  e LEAFDATA flag,
27530 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68   pParent cells h
27540 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73  old only INTKEYs
27550 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
27560 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
27570 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63  of keys on the c
27580 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20  hild pages.  We 
27590 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20  need to remove. 
275a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69         ** the di
275b0 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
275c0 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68   pParent, but th
275d0 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  e dividers cells
275e0 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20   are not.       
275f0 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43   ** added to apC
27600 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68  ell[] because th
27610 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ey are duplicate
27620 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73  s of child cells
27630 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27640 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
27650 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
27660 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27670 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d          u8 *pTem
27680 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
27690 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
276a0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ls );.        sz
276b0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
276c0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
276d0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
276e0 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70  e1];.        iSp
276f0 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
27700 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
27710 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
27720 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
27730 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
27740 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
27750 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
27760 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
27770 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
27780 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
27790 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
277a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
277b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
277c0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
277d0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
277e0 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
277f0 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
27800 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
27810 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
27820 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
27830 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
27840 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
27850 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
27860 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
27870 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
27880 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
27890 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
278a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
278b0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
278c0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
278d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
278e0 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
278f0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
27900 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
27910 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
27920 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
27930 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
27940 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
27950 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
27960 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
27970 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
27980 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
27990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
279a0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
279b0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
279c0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
279d0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
279e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
279f0 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
27a00 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
27a10 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
27a20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
27a30 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
27a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27a50 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
27a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27a70 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
27a80 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
27a90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
27aa0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
27ab0 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
27ac0 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
27ad0 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
27ae0 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
27af0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
27b00 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
27b10 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
27b20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
27b30 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
27b40 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
27b50 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
27b60 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
27b70 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
27b80 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
27b90 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
27ba0 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
27bb0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
27bc0 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
27bd0 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
27be0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
27bf0 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
27c00 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
27c10 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
27c20 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
27c30 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
27c40 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
27c50 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
27c60 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
27c70 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
27c80 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
27c90 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
27ca0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
27cb0 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
27cc0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
27cd0 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
27ce0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
27cf0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
27d00 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
27d10 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
27d20 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
27d30 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
27d40 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
27d50 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
27d60 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
27d70 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
27d80 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
27d90 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
27da0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
27db0 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
27dc0 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
27dd0 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
27de0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
27df0 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
27e00 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
27e10 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
27e20 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
27e30 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
27e40 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d        k++;.    }
27e50 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
27e60 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
27e70 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
27e80 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
27e90 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
27ea0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
27eb0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
27ec0 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
27ed0 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
27ee0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
27ef0 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
27f00 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
27f10 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
27f20 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
27f30 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
27f40 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
27f50 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
27f60 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
27f70 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
27f80 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
27f90 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
27fa0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
27fb0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
27fc0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
27fd0 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
27fe0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
27ff0 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
28000 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
28010 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
28020 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
28030 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
28040 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
28050 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
28060 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
28070 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
28080 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
28090 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
280a0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
280b0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
280c0 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
280d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
280e0 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
280f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
28100 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
28110 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
28120 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
28130 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
28140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28150 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
28160 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
28170 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
28180 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
28190 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
281a0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
281b0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
281c0 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
281d0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
281e0 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
281f0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
28200 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
28210 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
28220 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
28230 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
28240 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
28250 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
28260 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
28270 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
28280 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
28290 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
282a0 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
282b0 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
282c0 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
282d0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
282e0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
282f0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
28300 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
28310 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
28320 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
28330 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
28340 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
28350 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
28360 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
28370 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65  0])>0) or we are
28380 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74   the.  ** a virt
28390 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
283a0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
283b0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
283c0 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
283d0 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
283e0 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
283f0 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
28400 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
28410 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
28420 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
28430 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
28440 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
28450 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
28460 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
28470 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
28480 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
28490 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
284a0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
284b0 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70  .  pageFlags = p
284c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  Page->aData[0];.
284d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
284e0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
284f0 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
28500 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
28510 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
28520 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
28530 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
28540 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  pgnoOld[i];.    
28550 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
28560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28570 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
28580 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
28590 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
285a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
285b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
285c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
285d0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
285e0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
285f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
28600 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
28610 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d  w[i], pgnoNew[i-
28620 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
28630 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
28640 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28650 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
28660 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
28670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28680 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
28690 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
286a0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
286b0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
286c0 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
286d0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
286e0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
286f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
28700 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28710 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28720 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
28730 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
28740 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
28750 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
28760 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
28770 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
28780 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
28790 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
287a0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
287b0 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
287c0 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
287d0 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
287e0 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
287f0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
28800 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
28810 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
28820 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
28830 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
28840 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
28850 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
28860 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
28870 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
28880 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
28890 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
288a0 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
288b0 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
288c0 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
288d0 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
288e0 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
288f0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
28900 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
28910 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
28920 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
28930 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
28940 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
28950 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
28960 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
28970 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
28980 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
28990 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
289a0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
289b0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
289c0 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
289d0 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c   if( pgnoNew[j]<
289e0 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
289f0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
28a00 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
28a10 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20   = pgnoNew[j];. 
28a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28a30 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
28a40 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
28a50 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
28a60 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77       t = pgnoNew
28a70 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  [i];.      pT = 
28a80 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
28a90 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e  pgnoNew[i] = pgn
28aa0 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  oNew[minI];.    
28ab0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
28ac0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
28ad0 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20  pgnoNew[minI] = 
28ae0 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  t;.      apNew[m
28af0 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
28b00 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
28b10 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
28b20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25  %d %d  new: %d(%
28b30 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
28b40 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
28b50 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30  ",.    pgnoOld[0
28b60 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  ], .    nOld>=2 
28b70 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30  ? pgnoOld[1] : 0
28b80 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
28b90 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a  pgnoOld[2] : 0,.
28ba0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20      pgnoNew[0], 
28bb0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
28bc0 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=2 ? pgnoNew[
28bd0 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  1] : 0, nNew>=2 
28be0 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
28bf0 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67      nNew>=3 ? pg
28c00 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e  noNew[2] : 0, nN
28c10 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
28c20 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
28c30 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a  4 ? pgnoNew[3] :
28c40 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
28c50 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
28c60 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65  nNew>=5 ? pgnoNe
28c70 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[4] : 0, nNew>=
28c80 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
28c90 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ));..  /*.  ** E
28ca0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
28cb0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
28cc0 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
28cd0 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
28ce0 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
28cf0 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
28d00 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
28d10 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
28d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
28d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
28d40 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
28d50 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
28d60 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
28d70 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
28d80 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
28d90 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
28da0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f  sert( pNew->pgno
28db0 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a  ==pgnoNew[i] );.
28dc0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
28dd0 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
28de0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
28df0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
28e00 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
28e10 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
28e20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
28e30 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
28e40 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
28e50 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
28e60 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
28e70 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66  w==0 );..#ifndef
28e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
28e90 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
28ea0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
28eb0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
28ec0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
28ed0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
28ee0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
28ef0 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
28f00 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
28f10 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
28f20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
28f30 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
28f40 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
28f50 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
28f60 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
28f70 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
28f80 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
28f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28fa0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28fb0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
28fc0 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
28fd0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
28fe0 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
28ff0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
29000 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
29010 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
29020 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
29030 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
29040 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29050 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
29060 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29080 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29090 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
290a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
290b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
290c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
290d0 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
290e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
290f0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
29100 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
29110 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
29120 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
29130 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
29140 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
29150 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
29160 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29170 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
29180 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
29190 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
291a0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
291b0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
291c0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
291d0 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
291e0 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
291f0 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
29200 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
29210 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
29220 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70 61   = &aSpace2[iSpa
29230 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ce2];.      if( 
29240 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
29250 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29260 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
29270 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
29280 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
29290 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
292a0 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
292b0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
292c0 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
292d0 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
292e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
292f0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
29300 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
29310 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
29320 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
29330 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
29340 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
29350 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
29360 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
29370 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
29380 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
29390 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
293a0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
293b0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
293c0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
293d0 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j--;.        sql
293e0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
293f0 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
29400 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
29410 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70         pCell = p
29420 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69  Temp;.        fi
29430 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
29440 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
29450 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
29460 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54  &sz);.        pT
29470 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
29480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
29490 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
294a0 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
294b0 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
294c0 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
294d0 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
294e0 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
294f0 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
29500 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
29510 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
29520 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
29530 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
29540 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
29550 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
29560 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
29570 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65    ** (see sqlite
29580 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
29590 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
295a0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
295b0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
295c0 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
295d0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
295e0 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
295f0 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
29600 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
29610 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
29620 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
29630 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29640 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
29650 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
29660 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
29670 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
29680 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
29690 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
296a0 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
296b0 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
296c0 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
296d0 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
296e0 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
296f0 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
29700 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
29710 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
29720 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
29730 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29740 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
29750 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
29760 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
29770 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
29780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29790 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20  }.      iSpace2 
297a0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
297b0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
297c0 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
297d0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
297e0 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  2<=pBt->pageSize
297f0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   );.      rc = i
29800 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
29810 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
29820 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a   sz, pTemp, 4);.
29830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29840 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
29850 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
29860 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
29870 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
29880 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
29890 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  pNew->pgno);.#if
298a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
298b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
298c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
298d0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
298e0 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74  atabase, and not
298f0 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
29900 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
29910 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
29920 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20  ter map with an 
29930 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
29940 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
29950 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65    ** that the ce
29960 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ll just inserted
29970 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61   points to (if a
29980 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
29990 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
299a0 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66  oVacuum && !leaf
299b0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
299c0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
299d0 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  fl(pParent, nxDi
299e0 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
299f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29a00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
29a10 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
29a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29a30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
29a40 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
29a50 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
29a60 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
29a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
29a80 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
29a90 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
29aa0 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
29ab0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
29ac0 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
29ad0 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
29ae0 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  8], &apCopy[nOld
29af0 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34  -1]->aData[8], 4
29b00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44  );.  }.  if( nxD
29b10 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
29b20 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
29b30 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
29b40 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
29b50 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
29b60 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
29b70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
29b80 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
29b90 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
29ba0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
29bb0 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
29bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
29bd0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29be0 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
29bf0 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
29c00 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
29c10 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
29c20 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
29c30 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
29c40 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
29c50 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
29c60 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
29c70 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
29c80 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
29c90 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20  parent children 
29ca0 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20  of all cells..  
29cb0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
29cc0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
29cd0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
29ce0 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d  ldPages(apNew[i]
29cf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29d00 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
29d10 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
29d20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61  .  }.  rc = repa
29d30 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
29d40 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
29d50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
29d60 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
29d70 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nup;..  /*.  ** 
29d80 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  Balance the pare
29d90 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74  nt page.  Note t
29da0 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
29db0 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67  page (pPage) mig
29dc0 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ht.  ** have bee
29dd0 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  n added to the f
29de0 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69  reelist so it mi
29df0 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  ght no longer be
29e00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
29e10 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e  ** But the paren
29e20 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61  t page will alwa
29e30 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ys be initialize
29e40 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
29e50 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
29e60 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  t );.  sqlite3Sc
29e70 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
29e80 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b  );.  apCell = 0;
29e90 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
29ea0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
29eb0 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
29ec0 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
29ed0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
29ee0 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
29ef0 74 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61  te3PageFree(aSpa
29f00 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ce2);.  sqlite3S
29f10 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
29f20 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
29f30 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
29f40 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
29f50 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
29f60 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
29f70 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
29f80 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
29f90 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
29fa0 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52  e(pParent);.  TR
29fb0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
29fc0 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a  inished with %d:
29fd0 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
29fe0 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
29ff0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
2a000 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e  o, nOld, nNew, n
2a010 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  Cell));.  return
2a020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2a030 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a040 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  lled for the roo
2a050 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65  t page of a btre
2a060 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a  e when the root.
2a070 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
2a080 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73   no cells.  This
2a090 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
2a0a0 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
2a0b0 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
2a0c0 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
2a0d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2a0e0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d  ance_shallower(M
2a0f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
2a100 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
2a110 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
2a120 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  * The only child
2a130 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a   page of pPage *
2a140 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
2a150 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2a160 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2a170 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20  for pChild */.  
2a180 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a190 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
2a1a0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
2a1b0 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
2a1c0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2a1d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2a1e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2a1f0 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20  BTree structure 
2a200 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50  */.  int mxCellP
2a210 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  erPage;         
2a220 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2a230 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72  ber of cells per
2a240 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2a250 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
2a260 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
2a270 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20  ells from pages 
2a280 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a  being balanced *
2a290 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2a2c0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a  f all cells */..
2a2d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a2e0 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
2a2f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a300 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2a310 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a320 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2a330 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a340 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2a350 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61  t;.  mxCellPerPa
2a360 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74  ge = MX_CELL(pBt
2a370 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  );.  apCell = sq
2a380 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43  lite3Malloc( mxC
2a390 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
2a3a0 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
2a3b0 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
2a3c0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2a3d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a3e0 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2a3f0 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
2a400 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
2a410 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2a420 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
2a430 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
2a440 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
2a450 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
2a460 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
2a470 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
2a480 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
2a490 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2a4a0 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
2a4b0 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
2a4c0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
2a4d0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
2a4e0 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
2a4f0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
2a500 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
2a510 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
2a520 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
2a530 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
2a540 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2a550 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
2a560 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
2a570 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
2a580 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
2a590 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
2a5a0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
2a5b0 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
2a5c0 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
2a5d0 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
2a5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
2a5f0 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
2a600 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
2a610 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
2a620 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2a630 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
2a640 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
2a650 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
2a660 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
2a670 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
2a680 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
2a690 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
2a6a0 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
2a6b0 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
2a6c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
2a6d0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2a6e0 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
2a6f0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
2a700 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
2a710 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
2a720 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
2a730 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2a740 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2a750 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2a760 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2a770 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d>0 );.    asser
2a780 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61  t( pgnoChild<=pa
2a790 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2a7a0 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
2a7b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2a7c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2a7d0 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
2a7e0 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c  oChild, &pChild,
2a7f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2a800 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
2a810 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2a820 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  if( pPage->pgno=
2a830 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
2a840 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2a850 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
2a860 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2a870 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
2a880 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2a890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
2a8a0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ild->nOverflow==
2a8b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2a8c0 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30  Child->nFree>=10
2a8d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2a8e0 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d  The child inform
2a8f0 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f  ation will fit o
2a900 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  n the root page,
2a910 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20   so do the.     
2a920 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20     ** copy */.  
2a930 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2a940 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50       zeroPage(pP
2a950 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2a960 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[0]);.        
2a970 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
2a980 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
2a990 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c            apCell
2a9a0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2a9b0 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20  Child,i);.      
2a9c0 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20      szCell[i] = 
2a9d0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69  cellSizePtr(pChi
2a9e0 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a  ld, apCell[i]);.
2a9f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa00 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2aa10 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43  Page, pChild->nC
2aa20 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43  ell, apCell, szC
2aa30 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ell);.        /*
2aa40 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d   Copy the right-
2aa50 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2aa60 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65  hild to the pare
2aa70 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  nt. */.        p
2aa80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2aa90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2aaa0 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20  Offset+8], .    
2aab0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
2aac0 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  (&pChild->aData[
2aad0 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65  pChild->hdrOffse
2aae0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  t+8]));.        
2aaf0 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
2ab00 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2ab10 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2ab20 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20   %d transfer to 
2ab30 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
2ab40 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
2ab50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ab60 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
2ab70 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
2ab80 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
2ab90 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
2aba0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65       ** The tree
2abb0 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61   is already bala
2abc0 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e  nced.  Do nothin
2abd0 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52  g. */.        TR
2abe0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2abf0 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74  hild %d will not
2ac00 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e   fit on page 1\n
2ac10 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
2ac20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ac30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
2ac40 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  py(pPage->aData,
2ac50 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20   pChild->aData, 
2ac60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2ac70 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  leSize);.      p
2ac80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2ac90 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
2aca0 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
2acb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2acc0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
2acd0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  e, 0);.      ass
2ace0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2acf0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65  OK );.      free
2ad00 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2ad10 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2ad20 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68  NCE: transfer ch
2ad30 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74  ild %d into root
2ad40 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
2ad50 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67        pChild->pg
2ad60 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  no, pPage->pgno)
2ad70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2ad80 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
2ad90 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20  ages(pPage);.   
2ada0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2adb0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2adc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2add0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ade0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2adf0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2ae00 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
2ae10 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2ae20 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  Cell; i++){ .   
2ae30 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ae40 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69  PutOvfl(pPage, i
2ae50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ae60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ae70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2ae80 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2ae90 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
2aea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
2aeb0 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  if.    releasePa
2aec0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
2aed0 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2aee0 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  nce:.  sqlite3_f
2aef0 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
2af00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2af10 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
2af20 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
2af30 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
2af40 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
2af50 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
2af60 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
2af70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
2af80 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
2af90 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
2afa0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2afb0 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
2afc0 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
2afd0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
2afe0 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
2aff0 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
2b000 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
2b010 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
2b020 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
2b030 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
2b040 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
2b050 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
2b060 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b080 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
2b090 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2b0a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2b0b0 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
2b0c0 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
2b0d0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
2b0e0 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2b0f0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2b100 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
2b110 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
2b120 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2b130 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
2b140 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
2b150 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
2b160 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
2b170 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
2b180 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
2b190 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2b1a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
2b1b0 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
2b1c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2b1d0 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
2b1e0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
2b1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2b200 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
2b210 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
2b220 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20  */.  int brk;   
2b230 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2b240 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
2b250 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
2b260 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
2b270 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
2b280 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
2b290 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2b2a0 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d  low>0 );.  pBt =
2b2b0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61   pPage->pBt;.  a
2b2c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2b2d0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2b2e0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2b2f0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2b300 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20  e(pBt, &pChild, 
2b310 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67  &pgnoChild, pPag
2b320 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69  e->pgno, 0);.  i
2b330 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b340 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
2b350 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b360 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
2b370 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c  Page) );.  usabl
2b380 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2b390 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20  bleSize;.  data 
2b3a0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2b3b0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2b3c0 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20  drOffset;.  brk 
2b3d0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2b3e0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
2b3f0 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
2b400 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
2b410 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
2b420 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2b430 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
2b440 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
2b450 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74  cdata[brk], &dat
2b460 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
2b470 7a 65 2d 62 72 6b 29 3b 0a 20 20 69 66 28 20 70  ze-brk);.  if( p
2b480 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 20 29 20  Child->isInit ) 
2b490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2b4a0 52 52 55 50 54 3b 0a 20 20 72 63 20 3d 20 73 71  RRUPT;.  rc = sq
2b4b0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2b4c0 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
2b4d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2b4e0 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72  to balancedeeper
2b4f0 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _out;.  memcpy(p
2b500 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50  Child->aOvfl, pP
2b510 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  age->aOvfl, pPag
2b520 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  e->nOverflow*siz
2b530 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
2b540 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
2b550 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
2b560 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
2b570 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76   if( pChild->nOv
2b580 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43  erflow ){.    pC
2b590 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
2b5a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2b5b0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50  Child->nCell==pP
2b5c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2b5d0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2b5e0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
2b5f0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
2b600 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2b610 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2b620 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2b630 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45  oChild);.  TRACE
2b640 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
2b650 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
2b660 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2b670 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2b680 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2b690 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2b6a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
2b6b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e  Vacuum ){.    in
2b6c0 74 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  t i;.    rc = pt
2b6d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68  rmapPut(pBt, pCh
2b6e0 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  ild->pgno, PTRMA
2b6f0 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e  P_BTREE, pPage->
2b700 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2b710 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2b720 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20  deeper_out;.    
2b730 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
2b740 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
2b750 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2b760 70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c  pPutOvfl(pChild,
2b770 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
2b780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b790 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2b7a0 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2b7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b7c0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
2b7d0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2b7e0 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63  pChild);..balanc
2b7f0 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
2b800 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2b810 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
2b820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
2b830 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
2b840 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
2b850 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
2b860 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
2b870 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
2b880 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
2b890 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
2b8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2b8b0 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
2b8c0 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
2b8d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b8e0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2b8f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b900 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2b910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2b920 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
2b930 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
2b940 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b950 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b960 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2b970 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2b980 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
2b990 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2b9a0 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
2b9b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b9c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b9d0 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
2b9e0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2b9f0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2ba00 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
2ba10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2ba20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2ba30 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
2ba40 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
2ba50 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
2ba60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2ba70 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
2ba80 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
2ba90 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
2baa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2bab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2bac0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
2bad0 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
2bae0 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
2baf0 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
2bb00 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
2bb10 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20  ors were opened 
2bb20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69  with wrFlag==0 i
2bb30 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  n a different.**
2bb40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2bb50 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65  tion (a database
2bb60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
2bb70 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65   shares the page
2bb80 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20  r.** cache with 
2bb90 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e  the current conn
2bba0 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74  ection) and that
2bbb0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2bbc0 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20  n .** is not in 
2bbd0 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69  the ReadUncommmi
2bbe0 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e  tted state, then
2bbf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2bc00 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2bc10 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41  _LOCKED..**.** A
2bc20 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72  s well as cursor
2bc30 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  s with wrFlag==0
2bc40 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77  , cursors with w
2bc50 72 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a  rFlag==1 and .**
2bc60 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
2bc70 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f  e==1 are also co
2bc80 6e 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20  nsidered 'read' 
2bc90 63 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65  cursors. Increme
2bca0 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75  ntal .** blob cu
2bcb0 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66  rsors are used f
2bcc0 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
2bcd0 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a  and writing..**.
2bce0 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74  ** When pgnoRoot
2bcf0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
2bd00 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74  e of an intkey t
2bd10 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  able, this funct
2bd20 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ion is also.** r
2bd30 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69  esponsible for i
2bd40 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72  nvalidating incr
2bd50 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
2bd60 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61  sors when the ta
2bd70 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68  ble row.** on wh
2bd80 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65  ich they are ope
2bd90 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f  ned is deleted o
2bda0 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73  r modified. Curs
2bdb0 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
2bdc0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
2bdd0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2bde0 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
2bdf0 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c   1) When BtreeCl
2be00 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61  earTable() is ca
2be10 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
2be20 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f  ly delete the co
2be30 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f  ntents.**      o
2be40 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65  f a B-Tree table
2be50 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
2be60 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61  t to zero and pa
2be70 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
2be80 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20  .**      set to 
2be90 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69  non-zero. In thi
2bea0 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65  s case all incre
2beb0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2bec0 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20  ors open.**     
2bed0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f   on the table ro
2bee0 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74  oted at pgnoRoot
2bef0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2bf00 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
2bf10 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c  n BtreeInsert(),
2bf20 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
2bf30 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29  r BtreePutData()
2bf40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a   is called to .*
2bf50 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20  *      modify a 
2bf60 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e  table row via an
2bf70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
2bf80 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
2bf90 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  to the .**      
2bfa0 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65  write cursor use
2bfb0 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69  d to do the modi
2bfc0 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72  fication and par
2bfd0 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73  ameter iRow is s
2bfe0 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  et.**      to th
2bff0 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64  e integer row id
2c000 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65   of the B-Tree e
2c010 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66  ntry being modif
2c020 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20  ied. Unless.**  
2c030 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20      pExclude is 
2c040 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d  itself an increm
2c050 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2c060 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72  r, then all incr
2c070 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20  emental.**      
2c080 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
2c090 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66  n on row iRow of
2c0a0 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20   the B-Tree are 
2c0b0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2c0c0 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20  **   3) If both 
2c0d0 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f  pExclude and iRo
2c0e0 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  w are set to zer
2c0f0 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61  o, no incrementa
2c100 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20  l blob .**      
2c110 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
2c120 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  lidated..*/.stat
2c130 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64  ic int checkRead
2c140 4c 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a  Locks(.  Btree *
2c150 70 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20  pBtree, .  Pgno 
2c160 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43  pgnoRoot, .  BtC
2c170 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c  ursor *pExclude,
2c180 0a 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20  .  i64 iRow.){. 
2c190 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
2c1a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2c1b0 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73  pBtree->pBt;.  s
2c1c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
2c1d0 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  ree->db;.  asser
2c1e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c1f0 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
2c200 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
2c210 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
2c220 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
2c230 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29  f( p==pExclude )
2c240 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c250 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
2c260 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69  pgnoRoot ) conti
2c270 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
2c280 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2c290 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  B.    if( p->isI
2c2a0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2c2b0 20 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70   ( .         (!p
2c2c0 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29  Exclude && iRow)
2c2d0 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c  .      || (pExcl
2c2e0 75 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65  ude && !pExclude
2c2f0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
2c300 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le && p->info.nK
2c310 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29  ey==iRow).    ))
2c320 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
2c330 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2c340 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ID;.    }.#endif
2c350 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
2c360 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2c370 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c380 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d   if( p->wrFlag==
2c390 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0 .#ifndef SQLIT
2c3a0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2c3b0 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63       || p->isInc
2c3c0 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64  rblobHandle.#end
2c3d0 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  if.    ){.      
2c3e0 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
2c3f0 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62   = p->pBtree->db
2c400 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74  ;.      if( dbOt
2c410 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  her==0 ||.      
2c420 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20     (dbOther!=db 
2c430 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61  && (dbOther->fla
2c440 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
2c450 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29  Uncommitted)==0)
2c460 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2c470 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2c480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c4a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c4b0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
2c4c0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54  cord into the BT
2c4d0 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73  ree.  The key is
2c4e0 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c   given by (pKey,
2c4f0 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65  nKey).** and the
2c500 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62   data is given b
2c510 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e  y (pData,nData).
2c520 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2c530 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20  used only to.** 
2c540 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c  define what tabl
2c550 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f  e the record sho
2c560 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20  uld be inserted 
2c570 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  into.  The curso
2c580 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
2c590 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
2c5a0 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  m location..**.*
2c5b0 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20  * For an INTKEY 
2c5c0 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20  table, only the 
2c5d0 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68  nKey value of th
2c5e0 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20  e key is used.  
2c5f0 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72  pKey is.** ignor
2c600 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44  ed.  For a ZEROD
2c610 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70  ATA table, the p
2c620 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61  Data and nData a
2c630 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e  re both ignored.
2c640 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c650 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74  treeInsert(.  Bt
2c660 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c680 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
2c690 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
2c6a0 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  is cursor */.  c
2c6b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2c6c0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2c6d0 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   The key of the 
2c6e0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2c6f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2c700 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f  a, int nData,  /
2c710 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68  * The data of th
2c720 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
2c730 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
2c760 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61  tra 0 bytes to a
2c770 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
2c780 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
2c790 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2c7a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c7b0 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61  s is likely an a
2c7c0 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ppend */.){.  in
2c7d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b  t rc;.  int loc;
2c7e0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
2c7f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2c800 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
2c810 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
2c820 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2c830 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
2c840 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20  char *oldCell;. 
2c850 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2c860 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20  newCell = 0;..  
2c870 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2c880 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2c890 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
2c8a0 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
2c8b0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
2c8c0 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
2c8d0 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
2c8e0 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72  e doing an inser
2c8f0 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42  t */.    rc = pB
2c900 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2c910 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2c920 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2c930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c940 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
2c950 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69  >readOnly );.  i
2c960 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
2c970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c980 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
2c990 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e   Cursor not open
2c9a0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a   for writing */.
2c9b0 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52    }.  if( checkR
2c9c0 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70  eadLocks(pCur->p
2c9d0 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e  Btree, pCur->pgn
2c9e0 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65  oRoot, pCur, nKe
2c9f0 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
2ca00 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2ca10 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2ca20 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2ca30 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2ca40 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
2ca50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
2ca60 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
2ca70 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
2ca80 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
2ca90 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2caa0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2cab0 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
2cac0 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72  le */.  clearCur
2cad0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2cae0 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51  );.  if( .    SQ
2caf0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2cb00 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2cb10 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2cb20 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20  t, pCur)) ||.   
2cb30 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2cb40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2cb50 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
2cb60 20 30 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64   0, nKey, append
2cb70 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29  Bias, &loc)).  )
2cb80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2cb90 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2cba0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
2cbb0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2cbc0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
2cbd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2cbe0 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
2cbf0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a  ge->leafData );.
2cc00 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54    TRACE(("INSERT
2cc10 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d  : table=%d nkey=
2cc20 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61  %lld ndata=%d pa
2cc30 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ge=%d %s\n",.   
2cc40 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
2cc50 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61  oRoot, nKey, nDa
2cc60 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ta, pPage->pgno,
2cc70 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d  .          loc==
2cc80 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20  0 ? "overwrite" 
2cc90 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b  : "new entry"));
2cca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ccb0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c  ->isInit );.  al
2ccc0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
2ccd0 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  pBt);.  newCell 
2cce0 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
2ccf0 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
2cd00 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2cd10 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
2cd20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
2cd30 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
2cd40 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
2cd50 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a  Data, nZero, &sz
2cd60 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
2cd70 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2cd80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2cd90 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
2cda0 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
2cdb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
2cdc0 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
2cdd0 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f  pBt) );.  if( lo
2cde0 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
2cdf0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2ce00 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  te ){.    u16 sz
2ce10 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
2ce20 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
2ce30 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
2ce40 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
2ce50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ce60 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2ce70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2ce80 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
2ce90 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
2cea0 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20  }.    oldCell = 
2ceb0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2cec0 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20  pCur->idx);.    
2ced0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2cee0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2cef0 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
2cf00 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
2cf10 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
2cf20 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
2cf30 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
2cf40 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2cf50 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  oldCell);.    if
2cf60 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2cf70 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70  insert;.    drop
2cf80 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2cf90 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20  ->idx, szOld);. 
2cfa0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
2cfb0 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2cfc0 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
2cfd0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
2cfe0 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b  .    pCur->idx++
2cff0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
2d000 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2d010 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
2d020 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2d030 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d040 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
2d050 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2d060 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2d070 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
2d080 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2d090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2d0a0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2d0b0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2d0c0 61 67 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  age, 1);.  if( r
2d0d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d0e0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2d0f0 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e  Cur);.  }.end_in
2d100 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
2d110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2d120 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
2d130 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2d140 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
2d150 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2d160 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2d170 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2d180 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2d190 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43  3BtreeDelete(BtC
2d1a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2d1b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2d1c0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2d1d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d1e0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cell;.  int rc;.
2d1f0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2d200 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70   = 0;.  Btree *p
2d210 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2d220 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d230 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
2d240 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2d250 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2d260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d270 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2d280 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2d290 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2d2a0 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2d2b0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2d2c0 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2d2d0 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20   a delete */.   
2d2e0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2d2f0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2d300 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2d310 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2d320 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2d330 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2d340 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  y );.  if( pCur-
2d350 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d360 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
2d370 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
2d380 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2d390 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43  idx >= pPage->nC
2d3a0 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ell ){.    retur
2d3b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
2d3c0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69   /* The cursor i
2d3d0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
2d3e0 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  o anything */.  
2d3f0 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  }.  if( !pCur->w
2d400 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
2d410 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2d420 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70     /* Did not op
2d430 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66  en this cursor f
2d440 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2d450 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2d460 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2d470 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2d480 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  oot, pCur, pCur-
2d490 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20  >info.nKey) ){. 
2d4a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d4b0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2d4c0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2d4d0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2d4e0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  lock */.  }..  /
2d4f0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
2d500 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2d510 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69  ition (a no-op i
2d520 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2d530 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52  not in .  ** CUR
2d540 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2d550 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20  state) and save 
2d560 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2d570 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
2d580 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  rs .  ** open on
2d590 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
2d5a0 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   Then call sqlit
2d5b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2d5c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
2d5d0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77  that the entry w
2d5e0 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66  ill be deleted f
2d5f0 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
2d600 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f  .    (rc = resto
2d610 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2d620 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
2d630 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2d640 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2d650 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2d660 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2d670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d680 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2d690 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
2d6a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2d6b0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
2d6c0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
2d6d0 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65  s page and leave
2d6e0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   pCell pointing 
2d6f0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
2d700 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28  . The clearCell(
2d710 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79  ) call frees any
2d720 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2d730 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2d740 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54  the.  ** cell. T
2d750 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69  he cell itself i
2d760 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a  s still intact..
2d770 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66    */.  pCell = f
2d780 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2d790 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28  Cur->idx);.  if(
2d7a0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d7b0 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
2d7c0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
2d7d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65  ;.  }.  rc = cle
2d7e0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2d7f0 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ell);.  if( rc )
2d800 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2d810 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
2d820 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d830 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e  /*.    ** The en
2d840 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74  try we are about
2d850 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
2d860 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77  t a leaf so if w
2d870 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  e do not.    ** 
2d880 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20  do something we 
2d890 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c  will leave a hol
2d8a0 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  e on an internal
2d8b0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65   page..    ** We
2d8c0 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68   have to fill th
2d8d0 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67  e hole by moving
2d8e0 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20   in a cell from 
2d8f0 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20  a leaf.  The.   
2d900 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66   ** next Cell af
2d910 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62  ter the one to b
2d920 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61  e deleted is gua
2d930 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
2d940 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62   and.    ** to b
2d950 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63  e a leaf so we c
2d960 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a  an use it..    *
2d970 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c  /.    BtCursor l
2d980 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69  eafCur;.    unsi
2d990 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74  gned char *pNext
2d9a0 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  ;.    int notUse
2d9b0 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  d;.    unsigned 
2d9c0 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d  char *tempCell =
2d9d0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2d9e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61  !pPage->leafData
2d9f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
2da00 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
2da10 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72  r(pCur, &leafCur
2da20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2da30 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65  te3BtreeNext(&le
2da40 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  afCur, &notUsed)
2da50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2da60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2da70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2da80 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e  erWrite(leafCur.
2da90 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2daa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2dab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2dac0 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74        u16 szNext
2dad0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2dae0 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2daf0 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2db00 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2db10 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2db20 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2db30 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2db40 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e  ->pgno, leafCur.
2db50 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2db60 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2db70 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2db80 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2db90 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2dba0 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65    pNext = findCe
2dbb0 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2dbc0 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a  , leafCur.idx);.
2dbd0 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63        szNext = c
2dbe0 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43  ellSizePtr(leafC
2dbf0 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29  ur.pPage, pNext)
2dc00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2dc10 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2dc20 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20  )>=szNext+4 );. 
2dc30 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d       allocateTem
2dc40 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
2dc50 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42     tempCell = pB
2dc60 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
2dc70 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c      if( tempCell
2dc80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2dc90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2dca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dcb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dcc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2dcd0 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2dce0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70  ge, pCur->idx, p
2dcf0 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
2dd00 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
2dd10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2dd20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dd30 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2dd40 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2dd50 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2dd60 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c  ->idx), pgnoChil
2dd70 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  d);.        rc =
2dd80 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2dd90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2dda0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ddb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64  _OK ){.        d
2ddc0 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e  ropCell(leafCur.
2ddd0 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69  pPage, leafCur.i
2dde0 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20  dx, szNext);.   
2ddf0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2de00 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  e(leafCur.pPage,
2de10 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2de20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
2de30 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
2de40 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a  rsor(&leafCur);.
2de50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
2de60 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
2de70 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f  le=%d delete fro
2de80 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
2de90 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2dea0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2deb0 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  ));.    dropCell
2dec0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ded0 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2dee0 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2def0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2df00 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  pPage, 0);.  }. 
2df10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2df20 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
2df30 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
2df40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2df50 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
2df60 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20  ew BTree table. 
2df70 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54   Write into *piT
2df80 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a  able the page.**
2df90 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2dfa0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2dfb0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   new table..**.*
2dfc0 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79  * The type of ty
2dfd0 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  pe is determined
2dfe0 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61   by the flags pa
2dff0 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74  rameter.  Only t
2e000 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
2e010 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20  values of flags 
2e020 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
2e030 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c   use.  Other val
2e040 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73  ues for.** flags
2e050 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a   might not work:
2e060 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  .**.**     BTREE
2e070 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45  _INTKEY|BTREE_LE
2e080 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20  AFDATA     Used 
2e090 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77  for SQL tables w
2e0a0 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a  ith rowid keys.*
2e0b0 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f  *     BTREE_ZERO
2e0c0 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20  DATA            
2e0d0 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53        Used for S
2e0e0 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74  QL indices.*/.st
2e0f0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72  atic int btreeCr
2e100 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
2e110 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
2e120 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2e130 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2e140 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
2e150 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f  e *pRoot;.  Pgno
2e160 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74   pgnoRoot;.  int
2e170 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2e180 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2e190 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
2e1a0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2e1b0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2e1c0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2e1d0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2e1e0 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20  ction first */. 
2e1f0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2e200 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2e210 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2e220 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
2e230 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2e240 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2e250 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
2e260 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e270 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
2e280 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2e290 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2e2a0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2e2b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2e2c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
2e2d0 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
2e2e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2e2f0 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
2e300 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
2e310 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
2e320 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
2e330 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
2e340 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
2e350 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
2e360 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
2e370 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
2e380 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
2e390 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
2e3a0 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
2e3b0 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
2e3c0 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
2e3d0 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
2e3e0 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
2e3f0 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
2e400 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
2e410 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
2e420 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
2e430 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
2e440 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
2e450 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
2e460 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
2e470 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
2e480 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
2e490 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
2e4a0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
2e4b0 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
2e4c0 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
2e4d0 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
2e4e0 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
2e4f0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2e500 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
2e510 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
2e520 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2e530 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
2e540 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
2e550 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
2e560 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
2e570 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e580 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
2e590 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
2e5a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e5b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2e5c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e5d0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2e5e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
2e5f0 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
2e600 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
2e610 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
2e620 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
2e630 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2e640 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2e650 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f    while( pgnoRoo
2e660 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
2e670 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
2e680 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
2e690 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
2e6a0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2e6b0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
2e6c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e6d0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
2e6e0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
2e6f0 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
2e700 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
2e710 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
2e720 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
2e730 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
2e740 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2e750 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
2e760 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
2e770 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
2e780 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
2e790 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
2e7a0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2e7b0 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
2e7c0 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
2e7d0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
2e7e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e7f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2e800 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e810 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
2e820 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
2e830 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
2e840 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
2e850 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
2e860 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2e870 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2e880 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
2e890 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
2e8a0 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
2e8b0 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
2e8c0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
2e8d0 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
2e8e0 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
2e8f0 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
2e900 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
2e910 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
2e920 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
2e930 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
2e940 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
2e950 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
2e960 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
2e970 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2e980 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
2e990 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
2e9a0 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
2e9b0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
2e9c0 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
2e9d0 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
2e9e0 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
2e9f0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2ea00 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2ea10 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2ea20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2ea30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ea40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2ea50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2ea60 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
2ea70 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
2ea80 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
2ea90 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
2eaa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2eab0 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
2eac0 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
2ead0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2eae0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2eaf0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2eb00 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2eb10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2eb20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2eb30 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
2eb40 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
2eb50 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
2eb60 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
2eb70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2eb80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
2eb90 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2eba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ebb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ebc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2ebd0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2ebe0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2ebf0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2ec00 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
2ec10 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
2ec20 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a  age, pgnoMove);.
2ec30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ec40 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
2ec50 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
2ec60 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
2ec70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
2ec80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ec90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2eca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2ecb0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2ecc0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
2ecd0 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
2ece0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2ecf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ed00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ed10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2ed20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ed30 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
2ed40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2ed50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ed60 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2ed70 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2ed80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ed90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2eda0 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  se{.      pRoot 
2edb0 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20  = pPageMove;.   
2edc0 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   } ..    /* Upda
2edd0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2ede0 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61  ap and meta-data
2edf0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f   with the new ro
2ee00 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
2ee10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  */.    rc = ptrm
2ee20 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52  apPut(pBt, pgnoR
2ee30 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  oot, PTRMAP_ROOT
2ee40 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
2ee50 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2ee60 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2ee70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2ee80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
2ee90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
2eea0 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70  dateMeta(p, 4, p
2eeb0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2eec0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
2eed0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2eee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2eef0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  c;.    }..  }els
2ef00 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  e{.    rc = allo
2ef10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2ef20 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2ef30 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Root, 1, 0);.   
2ef40 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ef50 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2ef60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ef70 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ef80 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2ef90 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ) );.  zeroPage(
2efa0 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50  pRoot, flags | P
2efb0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69  TF_LEAF);.  sqli
2efc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52  te3PagerUnref(pR
2efd0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2efe0 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74   *piTable = (int
2eff0 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74  )pgnoRoot;.  ret
2f000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f010 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2f020 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2f030 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2f040 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2f050 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
2f060 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
2f070 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20  );.  p->pBt->db 
2f080 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20  = p->db;.  rc = 
2f090 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
2f0a0 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61  (p, piTable, fla
2f0b0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
2f0c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
2f0d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f0e0 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76  ** Erase the giv
2f0f0 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
2f100 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69   and all its chi
2f110 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a  ldren.  Return.*
2f120 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  * the page to th
2f130 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
2f140 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44  tatic int clearD
2f150 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42  atabasePage(.  B
2f160 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2f170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2f180 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Tree that contai
2f190 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ns the table */.
2f1a0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
2f1b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2f1c0 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20  number to clear 
2f1d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2f1e0 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
2f1f0 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c  rent page.  NULL
2f200 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f   for the root */
2f210 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
2f220 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag      /* Deal
2f230 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
2f240 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  rue */.){.  MemP
2f250 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2f260 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
2f270 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2f280 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
2f290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f2a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2f2b0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
2f2c0 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
2f2d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
2f2e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2f2f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f300 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65  ;.  }..  rc = ge
2f310 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2f320 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20  , pgno, &pPage, 
2f330 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
2f340 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2f350 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2f360 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2f370 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
2f380 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  {.    pCell = fi
2f390 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
2f3a0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2f3b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2f3c0 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2f3d0 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
2f3e0 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61  byte(pCell), pPa
2f3f0 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2f400 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2f410 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2f420 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  sepage_out;.    
2f430 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  }.    rc = clear
2f440 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2f450 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2f460 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2f470 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
2f480 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2f490 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
2f4a0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2f4b0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2f4c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d  &pPage->aData[8]
2f4d0 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ), pPage->pParen
2f4e0 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
2f4f0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2f500 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2f510 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61    }.  if( freePa
2f520 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  geFlag ){.    rc
2f530 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2f540 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
2f550 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2f560 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2f570 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20  DbPage))==0 ){. 
2f580 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2f590 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
2f5a0 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
2f5b0 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
2f5c0 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
2f5d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2f5e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f5f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2f600 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
2f610 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
2f620 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
2f630 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
2f640 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
2f650 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
2f660 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
2f670 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
2f680 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
2f690 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2f6a0 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
2f6b0 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
2f6c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
2f6d0 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
2f6e0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
2f6f0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
2f700 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
2f710 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
2f720 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
2f730 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
2f740 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
2f750 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
2f760 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2f770 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2f780 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20   iTable){.  int 
2f790 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
2f7a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2f7b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2f7c0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
2f7d0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
2f7e0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2f7f0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
2f800 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2f810 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2f820 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2f830 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
2f840 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f  rc = checkReadLo
2f850 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cks(p, iTable, 0
2f860 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , 1))!=SQLITE_OK
2f870 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
2f880 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
2f890 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
2f8a0 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
2f8b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61  Cursors(pBt, iTa
2f8c0 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  ble, 0)) ){.    
2f8d0 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
2f8e0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
2f8f0 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2f900 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67  asePage(pBt, (Pg
2f910 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29  no)iTable, 0, 0)
2f920 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
2f930 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
2f940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f950 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
2f960 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
2f970 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
2f980 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2f990 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
2f9a0 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
2f9b0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2f9c0 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
2f9d0 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
2f9e0 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20  age 1) is never 
2f9f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2fa00 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elist..**.** Thi
2fa10 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2fa20 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2fa30 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2fa40 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2fa50 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
2fa60 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  able..**.** If A
2fa70 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
2fa80 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  bled and the pag
2fa90 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e  e at iTable is n
2faa0 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  ot the last.** r
2fab0 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2fac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2fad0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f  hen the last roo
2fae0 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68  t page .** in th
2faf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fb00 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  is moved into th
2fb10 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  e slot formerly 
2fb20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69  occupied by.** i
2fb30 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c  Table and that l
2fb40 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  ast slot formerl
2fb50 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68  y occupied by th
2fb60 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2fb70 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
2fb80 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73  the freelist ins
2fb90 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20  tead of iTable. 
2fba0 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c   In this say, al
2fbb0 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
2fbc0 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20  are kept at the 
2fbd0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2fbe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2fbf0 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65  which.** is nece
2fc00 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41  ssary for AUTOVA
2fc10 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67  CUUM to work rig
2fc20 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73  ht.  *piMoved is
2fc30 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20   set to the .** 
2fc40 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
2fc50 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20   used to be the 
2fc60 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2fc70 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  n the file befor
2fc80 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20  e.** the move.  
2fc90 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20  If no page gets 
2fca0 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20  moved, *piMoved 
2fcb0 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20  is set to 0..** 
2fcc0 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  The last root pa
2fcd0 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ge is recorded i
2fce0 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68  n meta[3] and th
2fcf0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65  e value of.** me
2fd00 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64  ta[3] is updated
2fd10 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
2fd20 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
2fd30 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65  t btreeDropTable
2fd40 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2fd50 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
2fd60 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2fd70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2fd80 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
2fd90 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2fda0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2fdb0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2fdc0 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 2d  x(p) );.  if( p-
2fdd0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2fde0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
2fdf0 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
2fe00 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2fe10 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2fe20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  OR;.  }..  /* It
2fe30 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
2fe40 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
2fe50 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
2fe60 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
2fe70 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
2fe80 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
2fe90 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
2fea0 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
2feb0 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
2fec0 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
2fed0 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
2fee0 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2fef0 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
2ff00 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
2ff10 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
2ff20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
2ff30 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
2ff40 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
2ff50 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
2ff60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ff70 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a  ITE_LOCKED;.  }.
2ff80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2ff90 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ffa0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
2ffb0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
2ffc0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ffd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2ffe0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
2fff0 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28  , iTable);.  if(
30000 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61   rc ){.    relea
30010 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30030 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20  }..  *piMoved = 
30040 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65  0;..  if( iTable
30050 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  >1 ){.#ifdef SQL
30060 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30070 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65  UUM.    rc = fre
30080 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30090 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
300a0 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  age);.#else.    
300b0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
300c0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  uum ){.      Pgn
300d0 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  o maxRootPgno;. 
300e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
300f0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
30100 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f   4, &maxRootPgno
30110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
30120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30130 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30140 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
30150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30160 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
30170 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50  iTable==maxRootP
30180 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  gno ){.        /
30190 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62  * If the table b
301a0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20  eing dropped is 
301b0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  the table with t
301c0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
301d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
301e0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
301f0 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20  tabase, put the 
30200 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65  root page on the
30210 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20   free list. .   
30220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30230 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
30240 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
30250 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30280 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30290 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
302a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
302b0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
302c0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f  being dropped do
302d0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  es not have the 
302e0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
302f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
30300 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
30310 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65  ase. So move the
30320 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
30330 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  into the .      
30340 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79    ** gap left by
30350 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f   the deleted roo
30360 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  t-page..        
30370 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  */.        MemPa
30380 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20  ge *pMove;.     
30390 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
303a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
303b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
303c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  GetPage(pBt, max
303d0 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
303e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
303f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
30410 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30420 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  }.        rc = r
30430 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
30440 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52   pMove, PTRMAP_R
30450 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62  OOTPAGE, 0, iTab
30460 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  le);.        rel
30470 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
30480 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
304a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
304b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
304c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
304d0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
304e0 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
304f0 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
30500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30540 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d  rc = freePage(pM
30550 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ove);.        re
30560 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
30570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30590 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
305a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
305b0 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d        *piMoved =
305c0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
305d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
305e0 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78  Set the new 'max
305f0 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75  -root-page' valu
30600 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
30610 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20  e header. This. 
30620 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f       ** is the o
30630 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e  ld value less on
30640 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65  e, less one more
30650 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   if that happens
30660 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
30670 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  a root-page numb
30680 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61  er, less one aga
30690 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68  in if that is th
306a0 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49  e.      ** PENDI
306b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20  NG_BYTE_PAGE..  
306c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78      */.      max
306d0 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
306e0 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
306f0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
30700 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
30710 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
30720 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
30730 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
30740 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
30750 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
30760 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  o) ){.        ma
30770 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
30780 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
30790 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d  t( maxRootPgno!=
307a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
307b0 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20  E(pBt) );..     
307c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
307d0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
307e0 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  4, maxRootPgno);
307f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30800 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
30810 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
30820 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30830 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
30840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
30850 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  f sqlite3BtreeDr
30860 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c  opTable was call
30870 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ed on page 1. */
30880 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
30890 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  age, PTF_INTKEY|
308a0 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20  PTF_LEAF );.    
308b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
308c0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
308d0 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
308e0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
308f0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
30900 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
30910 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
30920 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
30930 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
30940 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
30950 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70    rc = btreeDrop
30960 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
30970 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c   piMoved);.  sql
30980 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
30990 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
309a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
309b0 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  he meta-informat
309c0 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74  ion out of a dat
309d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74  abase file.  Met
309e0 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e  a[0].** is the n
309f0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
30a00 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
30a10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
30a20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75  Meta[1].** throu
30a30 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20  gh meta[15] are 
30a40 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
30a50 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65  e by higher laye
30a60 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  rs.  Meta[0].** 
30a70 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
30a80 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61  e others are rea
30a90 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20  d/write..** .** 
30aa0 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72  The schema layer
30ab0 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61   numbers meta va
30ac0 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  lues differently
30ad0 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61  .  At the schema
30ae0 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74  .** layer (and t
30af0 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64  he SetCookie and
30b00 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f   ReadCookie opco
30b10 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20  des) the number 
30b20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  of.** free pages
30b30 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e   is not visible.
30b40 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69    So Cookie[0] i
30b50 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65  s the same as Me
30b60 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ta[1]..*/.int sq
30b70 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
30b80 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
30b90 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29  idx, u32 *pMeta)
30ba0 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
30bb0 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  age;.  int rc;. 
30bc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
30bd0 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pP1;.  BtShared 
30be0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
30bf0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
30c00 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
30c10 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
30c20 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
30c30 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
30c40 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
30c50 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
30c60 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
30c70 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
30c80 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
30c90 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
30ca0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
30cb0 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
30cc0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
30cd0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
30ce0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
30cf0 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
30d00 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
30d10 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
30d20 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
30d30 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
30d40 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
30d50 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
30d60 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
30d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d80 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
30d90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
30da0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30db0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
30dc0 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
30dd0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
30de0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
30df0 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61  Pager, 1, &pDbPa
30e00 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ge);.  if( rc ){
30e10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
30e20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
30e30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
30e40 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
30e50 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
30e60 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
30e70 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20  ge);.  *pMeta = 
30e80 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  get4byte(&pP1[36
30e90 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71   + idx*4]);.  sq
30ea0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30eb0 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  pDbPage);..  /* 
30ec0 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  If autovacuumed 
30ed0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
30ee0 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65  his build but we
30ef0 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a   are trying to .
30f00 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61    ** access an a
30f10 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61  utovacuumed data
30f20 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  base, then make 
30f30 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61  the database rea
30f40 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66  donly. .  */.#if
30f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30f60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
30f70 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74   idx==4 && *pMet
30f80 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f  a>0 ) pBt->readO
30f90 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  nly = 1;.#endif.
30fa0 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72  .  /* Grab the r
30fb0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ead-lock on page
30fc0 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f   1. */.  rc = lo
30fd0 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45  ckTable(p, 1, RE
30fe0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69  AD_LOCK);.  sqli
30ff0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
31000 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31010 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65  ../*.** Write me
31020 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62  ta-information b
31030 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
31040 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20  abase.  Meta[0] 
31050 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20  is.** read-only 
31060 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  and may not be w
31070 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ritten..*/.int s
31080 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
31090 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  eMeta(Btree *p, 
310a0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65  int idx, u32 iMe
310b0 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ta){.  BtShared 
310c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
310d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
310e0 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pP1;.  int rc;. 
310f0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20   assert( idx>=1 
31100 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
31110 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
31120 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
31130 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
31140 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
31150 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
31160 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
31170 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
31180 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
31190 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
311a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
311b0 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  ge1!=0 );.    pP
311c0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
311d0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
311e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
311f0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
31200 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31220 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
31230 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
31240 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e  4], iMeta);.#ifn
31250 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31260 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
31270 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20   if( idx==7 ){. 
31280 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31290 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c  Bt->autoVacuum |
312a0 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20  | iMeta==0 );.  
312b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d        assert( iM
312c0 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d  eta==0 || iMeta=
312d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42  =1 );.        pB
312e0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
312f0 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23  iMeta;.      }.#
31300 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
31310 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
31320 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
31330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
31340 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79  turn the flag by
31350 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  te at the beginn
31360 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20  ing of the page 
31370 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
31380 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
31390 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
313a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
313b0 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
313c0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
313d0 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52  : What about CUR
313e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
313f0 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20  state? Probably 
31400 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  need to call.  *
31410 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  * restoreCursorP
31420 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a  osition() here..
31430 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a    */.  MemPage *
31440 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65  pPage;.  restore
31450 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
31460 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Cur);.  pPage = 
31470 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
31480 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
31490 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
314a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
314b0 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74  ->pBt==pCur->pBt
314c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
314d0 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74  ge ? pPage->aDat
314e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
314f0 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  et] : 0;.}.../*.
31500 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
31510 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
31520 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
31530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
31540 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
31550 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
31560 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
31570 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
31580 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
31590 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
315a0 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
315b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
315c0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
315d0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
315e0 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
315f0 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
31600 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
31610 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
31620 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
31630 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
31640 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
31650 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
31660 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
31670 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  ap;.  if( !pChec
31680 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
31690 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
316a0 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
316b0 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
316c0 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
316d0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65  .  if( pCheck->e
316e0 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20  rrMsg.nChar ){. 
316f0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
31700 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
31710 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20  ->errMsg, "\n", 
31720 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  1);.  }.  if( zM
31730 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sg1 ){.    sqlit
31740 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
31750 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
31760 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20  , zMsg1, -1);.  
31770 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69  }.  sqlite3VXPri
31780 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  ntf(&pCheck->err
31790 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c  Msg, 1, zFormat,
317a0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
317b0 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  p);.}.#endif /* 
317c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
317d0 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
317e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
317f0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31800 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20  ECK./*.** Add 1 
31810 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
31820 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
31830 69 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20  iPage.  If this 
31840 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  is the second.**
31850 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
31860 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65  e page, add an e
31870 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
31880 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e  pCheck->zErrMsg.
31890 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
318a0 74 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20  there are 2 ore 
318b0 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20  more references 
318c0 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
318d0 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20  0 if.** if this 
318e0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66  is the first ref
318f0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
31900 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63  ge..**.** Also c
31910 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
31920 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20  ge number is in 
31930 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  bounds..*/.stati
31940 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49  c int checkRef(I
31950 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
31960 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63  ck, int iPage, c
31970 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a  har *zContext){.
31980 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
31990 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
319a0 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e   iPage>pCheck->n
319b0 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20  Page || iPage<0 
319c0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
319d0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
319e0 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64  ontext, "invalid
319f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22   page number %d"
31a00 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
31a10 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
31a20 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b  ( pCheck->anRef[
31a30 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20  iPage]==1 ){.   
31a40 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31a50 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31a60 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65  , "2nd reference
31a70 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50   to page %d", iP
31a80 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
31a90 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
31aa0 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66    (pCheck->anRef
31ab0 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a  [iPage]++)>1;.}.
31ac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31ad0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31ae0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
31af0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
31b00 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f  e pointer-map fo
31b10 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61  r page iChild ma
31b20 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69  ps to .** page i
31b30 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20  Parent, pointer 
31b40 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66  type ptrType. If
31b50 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20   not, append an 
31b60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
31b70 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73   to pCheck..*/.s
31b80 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
31b90 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72  Ptrmap(.  Integr
31ba0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
31bb0 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
31bc0 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  eck context */. 
31bd0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
31be0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
31bf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
31c00 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
31c10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
31c20 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
31c30 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   type */.  Pgno 
31c40 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  iParent,        
31c50 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
31c60 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74  inter map parent
31c70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
31c80 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
31c90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
31ca0 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
31cb0 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20  (used for error 
31cc0 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  msg) */.){.  int
31cd0 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61   rc;.  u8 ePtrma
31ce0 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pType;.  Pgno iP
31cf0 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20  trmapParent;..  
31d00 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
31d10 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69  Check->pBt, iChi
31d20 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65  ld, &ePtrmapType
31d30 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74  , &iPtrmapParent
31d40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
31d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
31d60 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31d70 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
31d80 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70  Failed to read p
31d90 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69  trmap key=%d", i
31da0 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
31db0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  rn;.  }..  if( e
31dc0 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70  PtrmapType!=eTyp
31dd0 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65  e || iPtrmapPare
31de0 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20  nt!=iParent ){. 
31df0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31e00 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31e10 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20  xt, .      "Bad 
31e20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65  ptr map entry ke
31e30 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25  y=%d expected=(%
31e40 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64  d,%d) got=(%d,%d
31e50 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c  )", .      iChil
31e60 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e  d, eType, iParen
31e70 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20  t, ePtrmapType, 
31e80 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
31e90 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
31ea0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e  .** Check the in
31eb0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
31ec0 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e  reelist or of an
31ed0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
31ee0 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74  ist..** Verify t
31ef0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
31f00 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c  f pages on the l
31f10 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61  ist is N..*/.sta
31f20 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69  tic void checkLi
31f30 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  st(.  IntegrityC
31f40 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49  k *pCheck,  /* I
31f50 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
31f60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
31f70 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20  nt isFreeList,  
31f80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
31f90 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61   a freelist.  Fa
31fa0 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  lse for overflow
31fb0 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20   page list */.  
31fc0 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
31fd0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
31fe0 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70  mber for first p
31ff0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
32000 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
32010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
32020 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
32030 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
32040 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  st */.  char *zC
32050 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a  ontext        /*
32060 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   Context for err
32070 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29  or messages */.)
32080 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
32090 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20   expected = N;. 
320a0 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50   int iFirst = iP
320b0 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d  age;.  while( N-
320c0 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d  - > 0 && pCheck-
320d0 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62  >mxErr ){.    Db
320e0 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b  Page *pOvflPage;
320f0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
32100 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20  ar *pOvflData;. 
32110 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29     if( iPage<1 )
32120 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32130 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
32140 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
32150 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65    "%d of %d page
32160 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f  s missing from o
32170 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61  verflow list sta
32180 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20  rting at %d",.  
32190 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70          N+1, exp
321a0 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a  ected, iFirst);.
321b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
321c0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
321d0 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
321e0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62  e, zContext) ) b
321f0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
32200 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43  lite3PagerGet(pC
32210 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50  heck->pPager, (P
32220 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66  gno)iPage, &pOvf
32230 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  lPage) ){.      
32240 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
32250 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
32260 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
32270 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
32280 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
32290 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61     }.    pOvflDa
322a0 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
322b0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
322c0 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50  erGetData(pOvflP
322d0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  age);.    if( is
322e0 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
322f0 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
32300 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d  te(&pOvflData[4]
32310 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
32320 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32330 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  M.      if( pChe
32340 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
32350 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
32360 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
32370 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  k, iPage, PTRMAP
32380 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
32390 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
323a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
323b0 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d  ( n>pCheck->pBt-
323c0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20  >usableSize/4-2 
323d0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
323e0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
323f0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
32400 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74         "freelist
32410 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20   leaf count too 
32420 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c  big on page %d",
32430 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
32440 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   N--;.      }els
32450 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
32460 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
32470 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
32480 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79  reePage = get4by
32490 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b  te(&pOvflData[8+
324a0 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  i*4]);.#ifndef S
324b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
324c0 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20  ACUUM.          
324d0 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
324e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
324f0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
32500 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
32510 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50  FreePage, PTRMAP
32520 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
32530 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
32540 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32550 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70        checkRef(p
32560 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
32570 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
32580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e       }.        N
32590 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   -= n;.      }. 
325a0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
325b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
325c0 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  UUM.    else{.  
325d0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64      /* If this d
325e0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
325f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64   auto-vacuum and
32600 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68   iPage is not th
32610 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
32620 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65  page in this ove
32630 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63  rflow list, chec
32640 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74  k that the point
32650 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
32660 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  .      ** the fo
32670 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74  llowing page mat
32680 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20  ches iPage..    
32690 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
326a0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
326b0 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b  Vacuum && N>0 ){
326c0 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74  .        i = get
326d0 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
326e0 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  ;.        checkP
326f0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c  trmap(pCheck, i,
32700 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
32710 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  2, iPage, zConte
32720 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
32730 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50   }.#endif.    iP
32740 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70  age = get4byte(p
32750 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73  OvflData);.    s
32760 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
32770 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d  (pOvflPage);.  }
32780 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
32790 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
327a0 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
327b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
327c0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
327d0 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75  ./*.** Do variou
327e0 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20  s sanity checks 
327f0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
32800 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74   of a tree.  Ret
32810 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  urn.** the tree 
32820 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67  depth.  Root pag
32830 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61  es return 0.  Pa
32840 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61  rents of root pa
32850 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c  ges.** return 1,
32860 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   and so forth..*
32870 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63  * .** These chec
32880 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a  ks are done:.**.
32890 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65  **      1.  Make
328a0 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73   sure that cells
328b0 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20   and freeblocks 
328c0 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a  do not overlap.*
328d0 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63  *          but c
328e0 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65  ombine to comple
328f0 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70  tely cover the p
32900 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20  age..**  NO  2. 
32910 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20   Make sure cell 
32920 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65  keys are in orde
32930 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d  r..**  NO  3.  M
32940 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
32950 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
32960 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42  equal to zLowerB
32970 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e  ound..**  NO  4.
32980 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
32990 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ey is greater th
329a0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
329b0 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  UpperBound..**  
329c0 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68      5.  Check th
329d0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f  e integrity of o
329e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
329f0 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72  *      6.  Recur
32a00 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63  sively call chec
32a10 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c  kTreePage on all
32a20 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20   children..**   
32a30 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68     7.  Verify th
32a40 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  at the depth of 
32a50 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20  all children is 
32a60 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20  the same..**    
32a70 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    8.  Make sure 
32a80 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20  this page is at 
32a90 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f  least 33% full o
32aa0 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20  r else it is.** 
32ab0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f           the roo
32ac0 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a  t of the tree..*
32ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
32ae0 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e  ckTreePage(.  In
32af0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
32b00 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66  k,  /* Context f
32b10 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
32b20 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  eck */.  int iPa
32b30 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
32b40 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
32b50 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65   the page to che
32b60 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ck */.  MemPage 
32b70 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
32b80 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   Parent page */.
32b90 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43    char *zParentC
32ba0 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e  ontext  /* Paren
32bb0 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  t context */.){.
32bc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32bd0 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64  ;.  int i, rc, d
32be0 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20  epth, d2, pgno, 
32bf0 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20  cnt;.  int hdr, 
32c00 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74  cellStart;.  int
32c10 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61   nCell;.  u8 *da
32c20 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
32c30 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  pBt;.  int usabl
32c40 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43  eSize;.  char zC
32c50 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63  ontext[100];.  c
32c60 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c  har *hit;..  sql
32c70 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32c80 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
32c90 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20  zContext, "Page 
32ca0 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a  %d: ", iPage);..
32cb0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
32cc0 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a  the page exists.
32cd0 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68    */.  pBt = pCh
32ce0 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
32cf0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
32d00 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
32d10 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
32d20 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
32d30 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
32d40 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
32d50 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
32d60 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
32d70 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
32d80 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
32d90 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
32da0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
32db0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32dc0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
32dd0 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
32de0 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
32df0 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
32e00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
32e10 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
32e20 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
32e30 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29  pPage, pParent))
32e40 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
32e50 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32e60 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e80 22 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69  "sqlite3BtreeIni
32e90 74 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20  tPage() returns 
32ea0 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20  error code %d", 
32eb0 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  rc);.    release
32ec0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
32ed0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
32ee0 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61    /* Check out a
32ef0 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20  ll the cells..  
32f00 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a  */.  depth = 0;.
32f10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
32f20 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68  ge->nCell && pCh
32f30 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29  eck->mxErr; i++)
32f40 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  {.    u8 *pCell;
32f50 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20  .    int sz;.   
32f60 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
32f70 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61  .    /* Check pa
32f80 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70  yload overflow p
32f90 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ages.    */.    
32fa0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
32fb0 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
32fc0 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  ), zContext,.   
32fd0 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72            "On tr
32fe0 65 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20  ee page %d cell 
32ff0 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29  %d: ", iPage, i)
33000 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
33010 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b  ndCell(pPage,i);
33020 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
33030 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
33040 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
33050 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66  o);.    sz = inf
33060 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28  o.nData;.    if(
33070 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
33080 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65  ) sz += info.nKe
33090 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  y;.    assert( s
330a0 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  z==info.nPayload
330b0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69   );.    if( sz>i
330c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
330d0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
330e0 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  (sz - info.nLoca
330f0 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  l + usableSize -
33100 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20   5)/(usableSize 
33110 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f  - 4);.      Pgno
33120 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
33130 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
33140 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69  .iOverflow]);.#i
33150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33160 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33170 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33180 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33190 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
331a0 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  heck, pgnoOvfl, 
331b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
331c0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
331d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
331e0 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69  if.      checkLi
331f0 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67  st(pCheck, 0, pg
33200 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a  noOvfl, nPage, z
33210 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  Context);.    }.
33220 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61  .    /* Check sa
33230 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69  nity of left chi
33240 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ld page..    */.
33250 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
33260 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67  leaf ){.      pg
33270 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
33280 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
33290 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
332a0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
332b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
332c0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
332d0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
332e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
332f0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
33300 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
33310 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68  if.      d2 = ch
33320 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
33330 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43  ck,pgno,pPage,zC
33340 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69  ontext);.      i
33350 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65  f( i>0 && d2!=de
33360 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63  pth ){.        c
33370 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
33380 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
33390 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74  "Child page dept
333a0 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20  h differs");.   
333b0 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68     }.      depth
333c0 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = d2;.    }.  }
333d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
333e0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
333f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
33400 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
33410 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
33420 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
33430 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
33440 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  ext), zContext, 
33450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33460 20 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25        "On page %
33470 64 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64  d at right child
33480 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  : ", iPage);.#if
33490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
334a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
334b0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
334c0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  uum ){.      che
334d0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
334e0 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
334f0 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a  REE, iPage, 0);.
33500 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33510 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
33520 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61  Check, pgno, pPa
33530 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
33540 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20   }. .  /* Check 
33550 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76  for complete cov
33560 65 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  erage of the pag
33570 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20  e.  */.  data = 
33580 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
33590 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
335a0 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20  Offset;.  hit = 
335b0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
335c0 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
335d0 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b   );.  if( hit ){
335e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
335f0 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 29   0, usableSize )
33600 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  ;.    memset(hit
33610 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64  , 1, get2byte(&d
33620 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20  ata[hdr+5]));.  
33630 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
33640 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
33650 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20  ;.    cellStart 
33660 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
33670 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
33680 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
33690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
336a0 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
336b0 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b  &data[cellStart+
336c0 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36  i*2]);.      u16
336d0 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
336e0 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
336f0 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  [pc]);.      int
33700 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   j;.      if( (p
33710 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  c+size-1)>=usabl
33720 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b  eSize || pc<0 ){
33730 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
33740 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33750 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
33760 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
33770 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
33780 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
33790 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
337a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
337b0 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e  (j=pc+size-1; j>
337c0 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  =pc; j--) hit[j]
337d0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
337e0 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c  }.    for(cnt=0,
337f0 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74   i=get2byte(&dat
33800 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26  a[hdr+1]); i>0 &
33810 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26  & i<usableSize &
33820 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20  & cnt<10000; .  
33830 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b           cnt++){
33840 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
33850 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
33860 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  [i+2]);.      in
33870 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
33880 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  i+size-1)>=usabl
33890 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a  eSize || i<0 ){.
338a0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
338b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
338c0 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
338d0 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
338e0 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
338f0 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
33900 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
33910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
33920 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  (j=i+size-1; j>=
33930 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  i; j--) hit[j]++
33940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33950 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  i = get2byte(&da
33960 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ta[i]);.    }.  
33970 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69    for(i=cnt=0; i
33980 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b  <usableSize; i++
33990 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74  ){.      if( hit
339a0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
339b0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d    cnt++;.      }
339c0 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e  else if( hit[i]>
339d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  1 ){.        che
339e0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
339f0 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ck, 0,.         
33a00 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20   "Multiple uses 
33a10 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70  for byte %d of p
33a20 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67  age %d", i, iPag
33a30 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
33a40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
33a50 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61  .    if( cnt!=da
33a60 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20  ta[hdr+7] ){.   
33a70 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33a80 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
33a90 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e          "Fragmen
33aa0 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20  ted space is %d 
33ab0 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73  byte reported as
33ac0 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
33ad0 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20  .          cnt, 
33ae0 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61  data[hdr+7], iPa
33af0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
33b00 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
33b10 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73  (hit);..  releas
33b20 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
33b30 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a  return depth+1;.
33b40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
33b50 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
33b60 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
33b70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33b80 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
33b90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
33ba0 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65  ne does a comple
33bb0 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20  te check of the 
33bc0 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65  given BTree file
33bd0 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a  .  aRoot[] is.**
33be0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67   an array of pag
33bf0 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20  es numbers were 
33c00 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72  each page number
33c10 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
33c20 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e  e of.** a table.
33c30 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e    nRoot is the n
33c40 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
33c50 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   in aRoot..**.**
33c60 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63   If everything c
33c70 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20  hecks out, this 
33c80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
33c90 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68  NULL.  If someth
33ca0 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c  ing is.** amiss,
33cb0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
33cc0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
33cd0 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
33ce0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a  d from malloc().
33cf0 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ** and a pointer
33d00 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d   to that error m
33d10 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e  essage is return
33d20 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ed.  The calling
33d30 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
33d40 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
33d50 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f  freeing the erro
33d60 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69  r message when i
33d70 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68  t is done..*/.ch
33d80 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
33d90 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
33da0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
33db0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
33dc0 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
33dd0 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
33de0 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
33df0 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
33e00 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
33e10 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
33e20 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
33e30 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
33e40 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
33e50 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
33e60 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
33e70 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
33e80 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
33e90 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
33ea0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
33eb0 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
33ec0 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  riable */.){.  i
33ed0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
33ee0 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
33ef0 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
33f00 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
33f10 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30  ;.  char zErr[10
33f20 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  0];..  sqlite3Bt
33f30 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
33f40 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
33f50 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33    nRef = sqlite3
33f60 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
33f70 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
33f80 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  ( lockBtreeWithR
33f90 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f  etry(p)!=SQLITE_
33fa0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
33fb0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
33fc0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
33fd0 65 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65  e3StrDup("Unable
33fe0 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65   to acquire a re
33ff0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
34000 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
34010 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
34020 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
34030 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
34040 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
34050 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
34060 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
34070 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
34080 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
34090 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
340a0 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64  pnErr = 0;.#ifnd
340b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
340c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
340d0 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29  pBt->nTrunc!=0 )
340e0 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61  {.    sCheck.nPa
340f0 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ge = pBt->nTrunc
34100 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
34110 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
34120 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
34130 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
34140 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  t);.    sqlite3B
34150 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
34160 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34170 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d    sCheck.anRef =
34180 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
34190 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29  (sCheck.nPage+1)
341a0 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61  *sizeof(sCheck.a
341b0 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66  nRef[0]) );.  if
341c0 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  ( !sCheck.anRef 
341d0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
341e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
341f0 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b  .    *pnErr = 1;
34200 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
34210 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
34220 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72  eturn sqlite3MPr
34230 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e 61  intf(p->db, "Una
34240 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64  ble to malloc %d
34250 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20   bytes", .      
34260 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b    (sCheck.nPage+
34270 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
34280 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d  .anRef[0]));.  }
34290 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73  .  for(i=0; i<=s
342a0 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b  Check.nPage; i++
342b0 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  ){ sCheck.anRef[
342c0 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20  i] = 0; }.  i = 
342d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
342e0 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c  E(pBt);.  if( i<
342f0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b  =sCheck.nPage ){
34300 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65  .    sCheck.anRe
34310 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  f[i] = 1;.  }.  
34320 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
34330 6e 69 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d  nit(&sCheck.errM
34340 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66  sg, zErr, sizeof
34350 28 7a 45 72 72 29 2c 20 32 30 30 30 30 29 3b 0a  (zErr), 20000);.
34360 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
34370 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
34380 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
34390 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
343a0 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
343b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
343c0 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
343d0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
343e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
343f0 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
34400 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
34410 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
34420 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
34430 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
34440 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
34450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
34460 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
34470 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
34480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34490 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
344a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
344b0 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
344c0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
344d0 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
344e0 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
344f0 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
34500 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
34510 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
34520 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
34530 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
34540 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
34550 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
34560 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
34570 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
34580 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
34590 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
345a0 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  age && sCheck.mx
345b0 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  Err; i++){.#ifde
345c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
345d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
345e0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
345f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
34600 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
34610 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
34620 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
34630 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
34640 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
34650 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
34660 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
34670 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
34680 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
34690 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
346a0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
346b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
346c0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
346d0 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
346e0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
346f0 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
34700 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
34710 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
34720 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
34730 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
34740 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
34750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
34760 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
34770 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
34780 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
34790 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
347a0 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
347b0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
347c0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
347d0 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
347e0 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
347f0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
34800 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
34810 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
34820 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
34830 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
34840 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
34850 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
34860 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
34870 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   != sqlite3Pager
34880 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
34890 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65  ager) ){.    che
348a0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
348b0 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22  eck, 0, .      "
348c0 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  Outstanding page
348d0 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d   count goes from
348e0 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67   %d to %d during
348f0 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c   this analysis",
34900 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c  .      nRef, sql
34910 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
34920 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  t(pBt->pPager). 
34930 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
34940 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
34950 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
34960 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
34970 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69  Leave(p);.  sqli
34980 74 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e  te3_free(sCheck.
34990 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72  anRef);.  *pnErr
349a0 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a   = sCheck.nErr;.
349b0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72    if( sCheck.nEr
349c0 72 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74  r==0 ) sqlite3St
349d0 72 41 63 63 75 6d 52 65 73 65 74 28 26 73 43 68  rAccumReset(&sCh
349e0 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72  eck.errMsg);.  r
349f0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
34a00 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68  AccumFinish(&sCh
34a10 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23  eck.errMsg);.}.#
34a20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
34a30 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
34a40 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  HECK */../*.** R
34a50 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
34a60 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75  athname of the u
34a70 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
34a80 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
34a90 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d  he pager filenam
34aa0 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
34ab0 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
34ac0 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
34ad0 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
34ae0 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
34af0 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
34b00 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
34b10 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
34b20 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20  tFilename(Btree 
34b30 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
34b40 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
34b50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
34b60 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
34b70 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
34b80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
34b90 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
34ba0 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
34bb0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
34bc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34bd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
34be0 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65  r directory name
34bf0 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73   is invariant as
34c00 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67   long as the pag
34c10 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f  er is.** open so
34c20 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61   it is safe to a
34c30 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68  ccess without th
34c40 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78  e BtShared mutex
34c50 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
34c60 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
34c70 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  Dirname(Btree *p
34c80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
34c90 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
34ca0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
34cb0 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70  e3PagerDirname(p
34cc0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
34cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
34ce0 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
34cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34d00 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
34d10 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a  se. The return.*
34d20 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
34d30 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
34d40 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ame regardless o
34d50 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f  f whether the jo
34d60 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61  urnal file.** ha
34d70 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  s been created o
34d80 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r not..**.** The
34d90 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66   pager journal f
34da0 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72  ilename is invar
34db0 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20  iant as long as 
34dc0 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20  the pager is.** 
34dd0 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61  open so it is sa
34de0 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74  fe to access wit
34df0 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65  hout the BtShare
34e00 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73  d mutex..*/.cons
34e10 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
34e20 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
34e30 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
34e40 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
34e50 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
34e60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
34e70 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d  erJournalname(p-
34e80 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
34e90 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
34ea0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
34eb0 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70  ** Copy the comp
34ec0 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
34ed0 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74  pBtFrom into pBt
34ee0 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  To.  A transacti
34ef0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63  on.** must be ac
34f00 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69  tive for both fi
34f10 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  les..**.** The s
34f20 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20  ize of file pTo 
34f30 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62  may be reduced b
34f40 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
34f50 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  ..** If anything
34f60 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65   goes wrong, the
34f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
34f80 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  pTo is rolled ba
34f90 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ck. .**.** If su
34fa0 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74  ccessful, Commit
34fb0 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62  PhaseOne() may b
34fc0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20  e called on pTo 
34fd0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
34fe0 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  . .** The caller
34ff0 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63   should finish c
35000 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72  ommitting the tr
35010 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
35020 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73   by calling.** s
35030 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
35040 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  t()..*/.static i
35050 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65  nt btreeCopyFile
35060 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72  (Btree *pTo, Btr
35070 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e  ee *pFrom){.  in
35080 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35090 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50  ;.  Pgno i;..  P
350a0 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20  gno nFromPage;  
350b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
350c0 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a  pages in pFrom *
350d0 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65  /.  Pgno nToPage
350e0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
350f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
35100 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77  o */.  Pgno nNew
35110 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75  Page;      /* Nu
35120 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
35130 20 70 54 6f 20 61 66 74 65 72 20 74 68 65 20 63   pTo after the c
35140 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69  opy */..  Pgno i
35150 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  Skip;         /*
35160 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61   Pending byte pa
35170 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69  ge in pTo */.  i
35180 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  nt nToPageSize; 
35190 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
351a0 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20  of pTo in bytes 
351b0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61  */.  int nFromPa
351c0 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65  geSize;  /* Page
351d0 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69   size of pFrom i
351e0 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74  n bytes */..  Bt
351f0 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
35200 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
35210 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
35220 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42  pFrom->pBt;.  pB
35230 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64  tTo->db = pTo->d
35240 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62  b;.  pBtFrom->db
35250 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20   = pFrom->db;.. 
35260 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70   nToPageSize = p
35270 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  BtTo->pageSize;.
35280 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20    nFromPageSize 
35290 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53  = pBtFrom->pageS
352a0 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d  ize;..  if( pTo-
352b0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
352c0 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e  WRITE || pFrom->
352d0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
352e0 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
352f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35300 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f  .  }.  if( pBtTo
35310 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
35320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
35330 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50  USY;.  }..  nToP
35340 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
35350 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  ount(pBtTo->pPag
35360 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65  er);.  nFromPage
35370 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
35380 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
35390 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45  r);.  iSkip = PE
353a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
353b0 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61  pBtTo);..  /* Va
353c0 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20  riable nNewPage 
353d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
353e0 20 70 61 67 65 73 20 72 65 71 75 69 72 65 64 20   pages required 
353f0 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a  to store the.  *
35400 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46  * contents of pF
35410 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75  rom using the cu
35420 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20  rrent page-size 
35430 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  of pTo..  */.  n
35440 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36 34 29  NewPage = ((i64)
35450 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34  nFromPage * (i64
35460 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b  )nFromPageSize +
35470 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
35480 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20  e - 1) / .      
35490 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
354a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63  ;..  for(i=1; rc
354b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
354c0 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c  i<=nToPage || i<
354d0 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29  =nNewPage); i++)
354e0 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  {..    /* Journa
354f0 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  l the original p
35500 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
35510 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65 20  ** iSkip is the 
35520 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
35530 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20  he locking page 
35540 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  (PENDING_BYTE_PA
35550 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61  GE).    ** in da
35560 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66  tabase *pTo (bef
35570 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54  ore the copy). T
35580 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 76 65  his page is neve
35590 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a  r written .    *
355a0 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  * into the journ
355b0 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20  al file. Unless 
355c0 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20  i==iSkip or the 
355d0 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20  page was not.   
355e0 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70   ** present in p
355f0 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  To before the co
35600 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f  py operation, jo
35610 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f  urnal page i fro
35620 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  m pTo..    */.  
35630 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26    if( i!=iSkip &
35640 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a  & i<=nToPage ){.
35650 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
35660 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  bPage = 0;.     
35670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35680 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
35690 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65  ger, i, &pDbPage
356a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
356b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
356c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
356d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
356e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
356f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35700 20 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20   && i>nFromPage 
35710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35720 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20  Yeah.  It seems 
35730 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f  wierd to call Do
35740 6e 74 57 72 69 74 65 28 29 20 72 69 67 68 74 20  ntWrite() right 
35750 61 66 74 65 72 20 57 72 69 74 65 28 29 2e 20 42  after Write(). B
35760 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ut.          ** 
35770 74 68 61 74 20 69 73 20 62 65 63 61 75 73 65 20  that is because 
35780 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f  the names of tho
35790 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f  se procedures do
357a0 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20   not exactly .  
357b0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65          ** repre
357c0 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20 64  sent what they d
357d0 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61 6c  o.  Write() real
357e0 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68  ly means "put th
357f0 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20  is page in the. 
35800 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c           ** roll
35810 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
35820 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72 74   mark it as dirt
35830 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
35840 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  l be written.   
35850 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65         ** to the
35860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
35870 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
35880 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
35890 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
358a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
358b0 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65  and prevents the
358c0 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
358d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
358e0 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20  database. The.  
358f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
35900 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  is still on the 
35910 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
35920 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74  , though.  And t
35930 68 61 74 20 69 73 20 74 68 65 20 0a 20 20 20 20  hat is the .    
35940 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70        ** whole p
35950 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62 6c 6f  oint of this blo
35960 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73  ck: to put pages
35970 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   on the rollback
35980 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
35990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
359a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
359b0 6e 74 57 72 69 74 65 28 70 44 62 50 61 67 65 29  ntWrite(pDbPage)
359c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
359d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
359e0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
359f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35a00 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
35a10 74 68 65 20 64 61 74 61 20 69 6e 20 70 61 67 65  the data in page
35a20 20 69 20 6f 66 20 74 68 65 20 74 61 72 67 65 74   i of the target
35a30 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
35a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35a50 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70 20 26  OK && i!=iSkip &
35a60 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29 7b  & i<=nNewPage ){
35a70 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a  ..      DbPage *
35a80 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  pToPage = 0;.   
35a90 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
35aa0 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72 63   iOff;..      rc
35ab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35ac0 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  et(pBtTo->pPager
35ad0 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29 3b 0a  , i, &pToPage);.
35ae0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35af0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35b00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35b10 61 67 65 72 57 72 69 74 65 28 70 54 6f 50 61 67  agerWrite(pToPag
35b20 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
35b30 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20     for(.        
35b40 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50 61  iOff=(i-1)*nToPa
35b50 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20  geSize; .       
35b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35b70 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67 65  & iOff<i*nToPage
35b80 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20 69  Size; .        i
35b90 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65  Off += nFromPage
35ba0 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20 20  Size.      ){.  
35bb0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 46        DbPage *pF
35bc0 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  romPage = 0;.   
35bd0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20       Pgno iFrom 
35be0 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67  = (iOff/nFromPag
35bf0 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20 20  eSize)+1;..     
35c00 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45     if( iFrom==PE
35c10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
35c20 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  pBtFrom) ){.    
35c30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
35c40 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
35c50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35c60 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d  agerGet(pBtFrom-
35c70 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20  >pPager, iFrom, 
35c80 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20  &pFromPage);.   
35c90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
35ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35cb0 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20      char *zTo = 
35cc0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
35cd0 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a 20 20  ata(pToPage);.  
35ce0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46          char *zF
35cf0 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rom = sqlite3Pag
35d00 65 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50  erGetData(pFromP
35d10 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35d20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20 20  int nCopy;..    
35d30 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50        if( nFromP
35d40 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67 65  ageSize>=nToPage
35d50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
35d60 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28 69      zFrom += ((i
35d70 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 20  -1)*nToPageSize 
35d80 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72  - ((iFrom-1)*nFr
35d90 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  omPageSize));.  
35da0 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
35db0 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20  = nToPageSize;. 
35dc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 20              zTo 
35de0 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a 6e  += (((iFrom-1)*n
35df0 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d 20  FromPageSize) - 
35e00 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
35e10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
35e20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61 67  nCopy = nFromPag
35e30 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  eSize;.         
35e40 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 65   }..          me
35e50 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d 2c  mcpy(zTo, zFrom,
35e60 20 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c 69   nCopy);..  sqli
35e70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46  te3PagerUnref(pF
35e80 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
35e90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
35ea0 20 20 20 69 66 28 20 70 54 6f 50 61 67 65 20 29     if( pToPage )
35eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35ec0 65 66 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20  ef(pToPage);.   
35ed0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
35ee0 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b  things have work
35ef0 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64  ed so far, the d
35f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
35f10 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a   need to be .  *
35f20 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  * truncated. The
35f30 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73   complex part is
35f40 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65   that it may nee
35f50 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  d to be truncate
35f60 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65  d to.  ** a size
35f70 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20   that is not an 
35f80 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
35f90 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20   of nToPageSize 
35fa0 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  - the current.  
35fb0 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  ** page size use
35fc0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
35fd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 42  ssociated with B
35fe0 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a  -Tree pTo..  **.
35ff0 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65    ** For example
36000 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d 73  , say the page-s
36010 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30  ize of pTo is 20
36020 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  48 bytes and the
36030 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20   original .  ** 
36040 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
36050 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65  is 5 (10 KB file
36060 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20  ). If pFrom has 
36070 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31  a page size of 1
36080 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20  024 .  ** bytes 
36090 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68 65  and 9 pages, the
360a0 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73  n the file needs
360b0 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64   to be truncated
360c0 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20   to 9KB..  */.  
360d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
360e0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72  K ){.    if( nFr
360f0 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50  omPageSize!=nToP
36100 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
36110 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
36120 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
36130 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70  gerFile(pBtTo->p
36140 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36  Pager);.      i6
36150 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e  4 iSize = (i64)n
36160 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28  FromPageSize * (
36170 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20  i64)nFromPage;. 
36180 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20       i64 iNow = 
36190 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e  (i64)((nToPage>n
361a0 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65  NewPage)?nToPage
361b0 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36  :nNewPage) * (i6
361c0 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a  4)nToPageSize; .
361d0 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64 69        i64 iPendi
361e0 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49  ng = ((i64)PENDI
361f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36200 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f  To)-1) *(i64)nTo
36210 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20  PageSize;.  .   
36220 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65     assert( iSize
36230 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20  <=iNow );.  .   
36240 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61     /* Commit pha
36250 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65  se one syncs the
36260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
36270 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
36280 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  o .      ** cont
36290 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69  aining the origi
362a0 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65  nal data. It doe
362b0 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64  s not sync the d
362c0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
362d0 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66     ** itself. Af
362e0 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69  ter doing this i
362f0 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
36300 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e   OsTruncate() an
36310 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  d other.      **
36320 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68   file APIs on th
36330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36340 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20  directly..      
36350 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e  */.      pBtTo->
36360 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
36370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36380 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
36390 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  One(pBtTo->pPage
363a0 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20  r, 0, 0, 1);.   
363b0 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f     if( iSize<iNo
363c0 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  w && rc==SQLITE_
363d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
363e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
363f0 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a  cate(pFile, iSiz
36400 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  e);.      }.  . 
36410 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
36420 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61 74   that copied dat
36430 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  a from database 
36440 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64  pFrom to pTo did
36450 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f   not.      ** po
36460 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69  pulate the locki
36470 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61 62  ng page of datab
36480 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20  ase pTo. If the 
36490 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20  page-size of.   
364a0 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73     ** pFrom is s
364b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74  maller than that
364c0 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65   of pTo, this me
364d0 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69  ans some data wi
364e0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  ll.      ** not 
364f0 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64  have been copied
36500 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
36510 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    ** This block 
36520 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73 69  copies the missi
36530 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74  ng data from dat
36540 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70  abase pFrom to p
36550 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69  To .      ** usi
36560 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68  ng file APIs. Th
36570 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
36580 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  se at this point
36590 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20   we know that.  
365a0 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68      ** all of th
365b0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  e original data 
365c0 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65  from pTo has bee
365d0 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  n synced into th
365e0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
365f0 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69  nal file. At thi
36600 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
36610 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61   be safe to do a
36620 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20  nything at.     
36630 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64   ** all to the d
36640 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78 63  atabase file exc
36650 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74 20  ept truncate it 
36660 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20  to zero bytes.. 
36670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
36680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36690 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  && nFromPageSize
366a0 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26 20  <nToPageSize && 
366b0 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29 7b  iSize>iPending){
366c0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66  .        i64 iOf
366d0 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 0a  f;.        for(.
366e0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d 69            iOff=i
366f0 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20 20  Pending; .      
36700 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
36710 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e 64  K && iOff<(iPend
36720 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65 29  ing+nToPageSize)
36730 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  ; .          iOf
36740 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69  f += nFromPageSi
36750 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ze.        ){.  
36760 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
36770 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20  pFromPage = 0;. 
36780 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
36790 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f  rom = (iOff/nFro
367a0 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20 20  mPageSize)+1;.  
367b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
367c0 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  From==PENDING_BY
367d0 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29  TE_PAGE(pBtFrom)
367e0 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d 50   || iFrom>nFromP
367f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
36800 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
36810 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
36820 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36830 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
36840 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f  om->pPager, iFro
36850 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a  m, &pFromPage);.
36860 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
36870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36880 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
36890 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33  *zFrom = sqlite3
368a0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72  PagerGetData(pFr
368b0 6f 6d 50 61 67 65 29 3b 0a 20 20 09 20 20 72 63  omPage);.  .  rc
368c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
368d0 65 28 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c 20  e(pFile, zFrom, 
368e0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20 69  nFromPageSize, i
368f0 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Off);.          
36900 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36910 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ref(pFromPage);.
36920 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36930 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36940 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  .      /* Sync t
36950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36960 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
36970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36990 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 42 74  te3PagerSync(pBt
369a0 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  To->pPager);.   
369b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
369c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
369d0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
369e0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e  pBtTo->pPager, n
369f0 4e 65 77 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  NewPage);.    }.
36a00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
36a20 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46 69  BtTo->pageSizeFi
36a30 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  xed = 0;.    }. 
36a40 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
36a50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
36a60 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20  Rollback(pTo);. 
36a70 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
36a80 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
36a90 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  BtreeCopyFile(Bt
36aa0 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
36ab0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
36ac0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
36ad0 65 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20 73  eEnter(pTo);.  s
36ae0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
36af0 28 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d 20  (pFrom);.  rc = 
36b00 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70 54  btreeCopyFile(pT
36b10 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c  o, pFrom);.  sql
36b20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
36b30 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  From);.  sqlite3
36b40 42 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29 3b  BtreeLeave(pTo);
36b50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36b60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
36b70 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f  E_OMIT_VACUUM */
36b80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
36b90 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61  on-zero if a tra
36ba0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
36bb0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
36bc0 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
36bd0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
36be0 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73 71  sert( p==0 || sq
36bf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36c00 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
36c10 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
36c20 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
36c30 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a  ANS_WRITE));.}..
36c40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
36c50 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74 65  -zero if a state
36c60 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
36c70 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
36c80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
36c90 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  sInStmt(Btree *p
36ca0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
36cb0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
36cc0 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
36cd0 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d  rn (p->pBt && p-
36ce0 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d  >pBt->inStmt);.}
36cf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
36d00 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61  on-zero if a rea
36d10 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72 61  d (or write) tra
36d20 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
36d30 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
36d40 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54  e3BtreeIsInReadT
36d50 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
36d60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36d70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
36d80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
36d90 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d  return (p && (p-
36da0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
36db0 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NONE));.}../*.**
36dc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
36dd0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
36de0 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65   to a blob of me
36df0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
36e00 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  with.** a single
36e10 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54   shared-btree. T
36e20 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  he memory is use
36e30 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65  d by client code
36e40 20 66 6f 72 20 69 74 73 20 6f 77 6e 0a 2a 2a 20   for its own.** 
36e50 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78  purposes (for ex
36e60 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20  ample, to store 
36e70 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68  a high-level sch
36e80 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ema associated w
36e90 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72  ith .** the shar
36ea0 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62  ed-btree). The b
36eb0 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67  tree layer manag
36ec0 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  es reference cou
36ed0 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a  nting issues..**
36ee0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
36ef0 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
36f00 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74  d on a shared-bt
36f10 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65  ree, nBytes byte
36f20 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  s of memory.** a
36f30 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65  re allocated, ze
36f40 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e  roed, and return
36f50 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
36f60 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73 65  . For each subse
36f70 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74  quent .** call t
36f80 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65  he nBytes parame
36f90 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61  ter is ignored a
36fa0 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
36fb0 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a  the same blob.**
36fc0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72   of memory retur
36fd0 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ned. .**.** If t
36fe0 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65  he nBytes parame
36ff0 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
37000 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
37010 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
37020 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  .** allocated, a
37030 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   null pointer is
37040 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
37050 65 20 62 6c 6f 62 20 68 61 73 20 61 6c 72 65 61  e blob has alrea
37060 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63  dy been.** alloc
37070 61 74 65 64 2c 20 69 74 20 69 73 20 72 65 74 75  ated, it is retu
37080 72 6e 65 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a  rned as normal..
37090 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72  **.** Just befor
370a0 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
370b0 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68  ee is closed, th
370c0 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65  e function passe
370d0 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72  d as the .** xFr
370e0 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  ee argument when
370f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
37100 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20  cation was made 
37110 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  is invoked on th
37120 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c  e .** blob of al
37130 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20  located memory. 
37140 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
37150 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71  ould not call sq
37160 6c 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20  lite3_free().** 
37170 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  on the memory, t
37180 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64  he btree layer d
37190 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  oes that..*/.voi
371a0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53  d *sqlite3BtreeS
371b0 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20  chema(Btree *p, 
371c0 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64  int nBytes, void
371d0 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29  (*xFree)(void *)
371e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
371f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
37200 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
37210 28 70 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  (p);.  if( !pBt-
37220 3e 70 53 63 68 65 6d 61 20 26 26 20 6e 42 79 74  >pSchema && nByt
37230 65 73 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  es ){.    pBt->p
37240 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
37250 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65  MallocZero(nByte
37260 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72  s);.    pBt->xFr
37270 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65  eeSchema = xFree
37280 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
37290 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
372a0 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68  return pBt->pSch
372b0 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ema;.}../*.** Re
372c0 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f  turn true if ano
372d0 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65  ther user of the
372e0 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72   same shared btr
372f0 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ee as the argume
37300 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c  nt.** handle hol
37310 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
37320 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69  lock on the sqli
37330 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
37340 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
37350 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64  treeSchemaLocked
37360 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
37370 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
37380 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37390 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
373a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
373b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
373c0 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f   = (queryTableLo
373d0 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
373e0 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53  T, READ_LOCK)!=S
373f0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
37400 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
37410 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
37420 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
37430 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
37440 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ACHE./*.** Obtai
37450 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  n a lock on the 
37460 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74  table whose root
37470 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20 20   page is iTab.  
37480 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61  The.** lock is a
37490 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69   write lock if i
374a0 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72  sWritelock is tr
374b0 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  ue or a read loc
374c0 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61  k.** if it is fa
374d0 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
374e0 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c  te3BtreeLockTabl
374f0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
37500 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74 65  iTab, u8 isWrite
37510 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
37520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37530 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
37540 7b 0a 20 20 20 20 75 38 20 6c 6f 63 6b 54 79 70  {.    u8 lockTyp
37550 65 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 20 2b 20  e = READ_LOCK + 
37560 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20  isWriteLock;.   
37570 20 61 73 73 65 72 74 28 20 52 45 41 44 5f 4c 4f   assert( READ_LO
37580 43 4b 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  CK+1==WRITE_LOCK
37590 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
375a0 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c  isWriteLock==0 |
375b0 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31  | isWriteLock==1
375c0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
375d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
375e0 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c    rc = queryTabl
375f0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c  eLock(p, iTab, l
37600 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 69 66  ockType);.    if
37610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37620 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
37630 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c  ckTable(p, iTab,
37640 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
37650 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
37660 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
37670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
37680 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
37690 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
376a0 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  LOB./*.** Argume
376b0 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20  nt pCsr must be 
376c0 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
376d0 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61  for writing on a
376e0 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62  n .** INTKEY tab
376f0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  le currently poi
37700 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
37710 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a   table entry. .*
37720 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37730 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74  modifies the dat
37740 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  a stored as part
37750 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a   of that entry..
37760 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61  ** Only the data
37770 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c   content may onl
37780 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  y be modified, i
37790 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
377a0 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  e.** to change t
377b0 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
377c0 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f   data stored..*/
377d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
377e0 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f  ePutData(BtCurso
377f0 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66  r *pCsr, u32 off
37800 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
37810 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74  id *z){.  assert
37820 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
37830 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73  ex(pCsr) );.  as
37840 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37850 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70  tex_held(pCsr->p
37860 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
37870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43  ) );.  assert(pC
37880 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sr->isIncrblobHa
37890 6e 64 6c 65 29 3b 0a 0a 20 20 72 65 73 74 6f 72  ndle);..  restor
378a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
378b0 70 43 73 72 29 3b 0a 20 20 61 73 73 65 72 74 28  pCsr);.  assert(
378c0 20 70 43 73 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCsr->eState!=C
378d0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
378e0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  K );.  if( pCsr-
378f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
37900 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
37910 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
37920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
37930 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74  k some precondit
37940 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61  ions: .  **   (a
37950 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  ) the cursor is 
37960 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
37970 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65  ,.  **   (b) the
37980 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f  re is no read-lo
37990 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
379a0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61  being modified a
379b0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68  nd.  **   (c) th
379c0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
379d0 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f  at a valid row o
379e0 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  f an intKey tabl
379f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
37a00 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Csr->wrFlag ){. 
37a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37a20 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
37a30 20 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e   assert( !pCsr->
37a40 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20  pBt->readOnly . 
37a50 20 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72           && pCsr
37a60 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
37a70 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
37a80 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  E );.  if( check
37a90 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e  ReadLocks(pCsr->
37aa0 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67  pBtree, pCsr->pg
37ab0 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 2c 20 30 29  noRoot, pCsr, 0)
37ac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
37ad0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
37ae0 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
37af0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
37b00 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
37b10 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74  .  if( pCsr->eSt
37b20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
37b30 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50  LID || !pCsr->pP
37b40 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
37b50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37b60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
37b70 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
37b80 6f 61 64 28 70 43 73 72 2c 20 6f 66 66 73 65 74  oad(pCsr, offset
37b90 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
37ba0 20 63 68 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29   char *)z, 0, 1)
37bb0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20  ;.}../* .** Set 
37bc0 61 20 66 6c 61 67 20 6f 6e 20 74 68 69 73 20 63  a flag on this c
37bd0 75 72 73 6f 72 20 74 6f 20 63 61 63 68 65 20 74  ursor to cache t
37be0 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20  he locations of 
37bf0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a  pages from the .
37c00 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  ** overflow list
37c10 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
37c20 20 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73   row. This is us
37c30 65 64 20 62 79 20 63 75 72 73 6f 72 73 20 6f 70  ed by cursors op
37c40 65 6e 65 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72  ened.** for incr
37c50 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20  emental blob IO 
37c60 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  only..**.** This
37c70 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 61   function sets a
37c80 20 66 6c 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20   flag only. The 
37c90 61 63 74 75 61 6c 20 70 61 67 65 20 6c 6f 63 61  actual page loca
37ca0 74 69 6f 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73  tion cache.** (s
37cb0 74 6f 72 65 64 20 69 6e 20 42 74 43 75 72 73 6f  tored in BtCurso
37cc0 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69  r.aOverflow[]) i
37cd0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
37ce0 75 73 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  used by function
37cf0 0a 2a 2a 20 61 63 63 65 73 73 50 61 79 6c 6f 61  .** accessPayloa
37d00 64 28 29 20 28 74 68 65 20 77 6f 72 6b 65 72 20  d() (the worker 
37d10 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c  function for sql
37d20 69 74 65 33 42 74 72 65 65 44 61 74 61 28 29 20  ite3BtreeData() 
37d30 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  and.** sqlite3Bt
37d40 72 65 65 50 75 74 44 61 74 61 28 29 29 2e 0a 2a  reePutData())..*
37d50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
37d60 72 65 65 43 61 63 68 65 4f 76 65 72 66 6c 6f 77  reeCacheOverflow
37d70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
37d80 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
37d90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
37da0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
37db0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37dc0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
37dd0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
37de0 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 69   assert(!pCur->i
37df0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29  sIncrblobHandle)
37e00 3b 0a 20 20 61 73 73 65 72 74 28 21 70 43 75 72  ;.  assert(!pCur
37e10 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
37e20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
37e30 48 61 6e 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65  Handle = 1;.}.#e
37e40 6e 64 69 66 0a                                   ndif.